亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C# 异常处理完全指南:try-catch-finally、异常类型、自定义异常与最佳实践

异常是程序执行期间出现的问题。C# 异常是对程序运行时异常情况的响应(如除零)。异常提供从程序一部分向另一部分转移控制的方式。C# 异常处理基于四个关键字:try、catch、finally、throw。

关键字说明

语法结构

try {
    // 可能引发异常的语句
} catch (ExceptionName e1) {
    // 错误处理代码
} catch (ExceptionName e2) {
    // 错误处理代码
} catch (ExceptionName eN) {
    // 错误处理代码
} finally {
    // 无论是否异常都执行的语句
}

可列出多个 catch 捕获不同异常类型。

C# 异常类层次

C# 异常由类表示,直接或间接派生自 System.Exception。主要派生分支:

常见系统异常类

序号异常类及说明
1System.IO.IOException:处理 I/O 错误
2System.IndexOutOfRangeException:数组索引越界
3System.ArrayTypeMismatchException:数组类型不匹配
4System.NullReferenceException:引用空对象
5System.DivideByZeroException:除零错误
6System.InvalidCastException:类型转换错误
7System.OutOfMemoryException:内存不足
8System.StackOverflowException:栈溢出

异常处理示例:除零处理

using System;
namespace ErrorHandlingApplication {
    class DivNumbers {
        int result;
        DivNumbers() { result = 0; }
        
        public void division(int num1, int num2) {
            try {
                result = num1 / num2;
            } catch (DivideByZeroException e) {
                Console.WriteLine("Exception caught: {0}", e);
            } finally {
                Console.WriteLine("Result: {0}", result);
            }
        }
        
        static void Main(string[] args) {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}

输出:

Exception caught: System.DivideByZeroException: Attempted to divide by zero.
Result: 0

自定义异常

用户定义异常类派生自 Exception 类:

using System;
namespace UserDefinedException {
    public class TempIsZeroException : Exception {
        public TempIsZeroException(string message) : base(message) { }
    }
    
    public class Temperature {
        int temperature = 0;
        public void showTemp() {
            if (temperature == 0) {
                throw new TempIsZeroException("Zero Temperature found");
            } else {
                Console.WriteLine("Temperature: {0}", temperature);
            }
        }
    }
    
    class TestTemperature {
        static void Main(string[] args) {
            Temperature temp = new Temperature();
            try {
                temp.showTemp();
            } catch (TempIsZeroException e) {
                Console.WriteLine("TempIsZeroException: {0}", e.Message);
            }
            Console.ReadKey();
        }
    }
}

输出:TempIsZeroException: Zero Temperature found

重新抛出异常

在 catch 块中用 throw; 重新抛出当前异常(保留堆栈跟踪),或 throw new OtherException("msg", e); 包装异常:

try { ... }
catch (Exception e) {
    // 记录日志
    Log.Error(e);
    // 重新抛出原异常
    throw;
    // 或包装为新异常
    // throw new BusinessException("Operation failed", e);
}

异常处理最佳实践

标准异常构造函数模式

public class MyException : Exception {
    public MyException() { }
    public MyException(string message) : base(message) { }
    public MyException(string message, Exception inner) : base(message, inner) { }
    protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { }
}

C语言

  1. PLC与DCS:如何选择合适的自动化系统
  2. Liebherr PHS Allround:模块化托盘搬运系统 支撑大产能柔性生产
  3. Liebherr 扩展托盘搬运系统 助力柔性生产
  4. HS Flex 搬运系统提升 Hermle C42 加工中心操作效率与存储
  5. 掌握 C# using 指令:命名空间导入、别名与静态导入全解析
  6. C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
  7. C++ 异常处理实战:try、catch、throw 完整指南与示例
  8. 掌握 C++ 信号处理:安全中断管理与优雅程序终止
  9. 精通 Python 异常处理:try、except、else 与 finally 详解
  10. 精通 Python 异常处理:try、except、finally 与 raise 高效用法
  11. 精通 Java 异常处理:try-catch、finally、throw 与 throws 详解
  12. Java 9 模块系统:链接时、自定义运行时镜像与实战