在 .NET 中处理和引发异常
应用程序必须能够以一致的方式处理执行期间发生的错误。 .NET 提供一种以统一方式向应用程序报错的模型:.NET 操作通过引发异常来指示故障。
异常
异常是执行程序遇到的所有错误条件或意外行为。 异常可能由你的代码或调用的代码(如共享库)中的错误、不可用的操作系统资源、运行时遇到的意外情况(如无法验证的代码)等引发。 应用程序可从这些情况中的一些中恢复,但无法从其他情况中恢复。 尽管可以从大多数应用程序异常中恢复,但不能从大多数运行时异常中恢复。
在 .NET中,异常是从 System.Exception 类继承的对象。 异常引发自发生问题的代码区域。 异常在堆栈中向上传递,直到应用程序对其进行处理或者程序终止。
异常与传统的错误处理方法
传统上,语言的错误处理模型依赖语言检测错误和针对错误查找其处理程序的独特方式,或者依赖操作系统提供的错误处理机制。 .NET 实现异常处理的方式有以下优点:
引发和处理异常的方式与 .NET 编程语言的相同。
处理异常不需要任何特定的语言语法,但允许每种语言定义自己的语法。
可跨进程,甚至跨计算机边界引发异常。
可向应用程序添加异常处理代码以提高程序的可靠性。
异常相较于其他错误通知方法(如返回代码)具有多种优势。 故障不会被忽略掉,因为如果引发了异常且未得到解决,运行时会终止应用程序。 因为代码未能检查出是否存在故障返回代码,所以无效值不会继续在系统中传播。
常见异常
下表列出了一些常见的异常,以及会引发这些异常的原因的示例。
异常类型 | 描述 | 示例 |
---|---|---|
Exception | 所有异常的基类。 | 无(使用此异常的派生类)。 |
IndexOutOfRangeException | 仅当错误地对数组进行索引时,才由运行时引发。 | 在数组的有效范围外对数组进行索引:arr[arr.Length+1] |
NullReferenceException | 仅当引用 null 对象时,才由运行时引发。 | object o = null; o.ToString(); |
InvalidOperationException | 当处于无效状态时,由方法引发。 | 从基础集合删除项后调用 Enumerator.MoveNext() 。 |
ArgumentException | 所有自变量异常的基类。 | 无(使用此异常的派生类)。 |
ArgumentNullException | 由不允许参数为 null 的方法引发。 | String s = null; "Calculate".IndexOf(s); |
ArgumentOutOfRangeException | 由验证自变量是否位于给定范围内的方法引发。 | String s = "string"; s.Substring(s.Length+1); |