C# 异常类(Exception)
一、介绍
在 C# 中,异常处理是一种机制,用于在程序执行过程中检测和响应错误或异常情况。异常是指在程序执行期间发生的意外或不可预测的事件,这些事件可能会干扰程序的正常流程。
异常处理的主要目标是:
- 检测异常:当发生错误或异常情况时,C# 运行时会抛出一个异常对象。这个对象包含有关异常的信息,如异常类型、异常消息以及导致异常的源代码位置。
- 处理异常:程序员可以编写代码来处理异常,以确保程序能够优雅地恢复或终止执行,而不会导致程序崩溃或数据损坏。
在 C# 中,异常处理通常通过以下几个关键字和构造来实现:
- try:try 块用于包含可能会引发异常的代码。
- catch:catch 块用于捕获和处理 try 块中抛出的异常。catch 块可以针对不同类型的异常进行匹配,并执行相应的处理代码。
- finally:finally 块用于包含在 try 块中的代码无论是否引发异常都会执行的代码。通常在 finally 块中进行资源清理或者释放。
- throw:throw 关键字用于手动引发异常。程序员可以使用 throw 关键字在任何地方引发自定义的异常。
二、异常类
异常类 |
描述 |
Exception |
所有异常的基类。 |
SystemException |
所有系统异常的基类。 |
ApplicationException |
应用程序特定异常的基类。 |
IndexOutOfRangeException |
当数组索引超出范围时引发的异常。 |
ArgumentNullException |
当参数为 null 时引发的异常。 |
ArgumentException |
当参数无效时引发的异常。 |
InvalidOperationException |
当对象处于不正确状态时引发的异常。 |
FormatException |
当格式无效时引发的异常。 |
DivideByZeroException |
当除以零时引发的异常。 |
NullReferenceException |
当尝试访问 null 对象成员时引发的异常。 |
FileNotFoundException |
当文件未找到时引发的异常。 |
IOException |
输入/输出操作失败时引发的异常。 |
NotSupportedException |
当调用不支持的方法时引发的异常。 |
OutOfMemoryException |
当系统没有足够内存执行所请求的操作时引发的异常。 |
OverflowException |
当算术运算结果溢出范围时引发的异常。 |
TimeoutException |
当操作超时时引发的异常。 |
InvalidOperationException |
当对象处于无效状态时引发的异常。 |
KeyNotFoundException |
在尝试访问集合中不存在的键时引发的异常。 |
AggregateException |
包含一个或多个错误的聚合异常。 |
三、用户定义的异常类
当您需要创建更复杂的自定义异常类时,可以添加额外的字段、属性、方法或者覆盖基类的方法。以下是一个稍微复杂一点的示例,演示如何扩展自定义异常类:
// 自定义异常类继承自 Exception 类 public class CustomException : Exception { // 自定义异常类的额外属性 public DateTime Timestamp { get; } // 构造函数可以接受消息参数,并传递给基类的构造函数 public CustomException(string message) : base(message) { Timestamp = DateTime.Now; } // 自定义异常类的构造函数,接受消息和内部异常参数,并传递给基类的构造函数 public CustomException(string message, Exception innerException) : base(message, innerException) { Timestamp = DateTime.Now; } // 自定义异常类的方法 public void LogException() { // 在此方法中记录异常 Console.WriteLine($"Exception logged at: {Timestamp}"); } // 可以覆盖基类的方法,以提供自定义的异常信息格式 public override string ToString() { return $"Custom Exception: {Message} (Occurred at: {Timestamp})"; }
四、调用者信息
using System; using System.Diagnostics; public class CustomException : Exception { public string CallerMethodName { get; } public string CallerClassName { get; } public CustomException(string message) : base(message) { // 获取调用者信息 var frame = new StackFrame(1); CallerMethodName = frame.GetMethod().Name; CallerClassName = frame.GetMethod().DeclaringType.Name; } public override string ToString() { return $"Custom Exception: {Message}\nCaller Method: {CallerMethodName}\nCaller Class: {CallerClassName}"; } } class Program { static void Main() { try { ThrowException(); } catch (CustomException ex) { Console.WriteLine(ex); } } static void ThrowException() { throw new CustomException("自定义异常消息"); } }