应用程序必须能够以一致的方式处理执行期间发生的错误。 .NET 提供了一个模型,用于以统一的方式通知应用程序错误:.NET 通过抛出异常来指示失败。
例外
异常是执行程序遇到的任何错误条件或意外行为。 由于您自己的代码或您调用的代码(例如,某个共享库)中的错误、操作系统资源不可用、运行时遇到的意外情况(例如,无法验证的代码)等因素,可能会引发异常。 应用程序可以从其中一些条件中恢复,但不能从其他情况中恢复。 虽然可以从大多数应用程序异常中恢复,但无法从大多数运行时异常中恢复。
在 .NET 中,异常是从 System.Exception 类继承的对象。 异常引发自发生问题的代码区域。 异常会向上传递堆栈,直到应用程序处理它或程序终止。
异常与传统的错误处理方法
传统上,语言的错误处理模型依赖于语言的唯一方法来检测错误并查找它们的处理程序,或者依赖于作系统提供的错误处理机制。 .NET 实现异常处理的方式具有以下优势:
异常的抛出和处理在 .NET 编程语言中工作方式相同。
不需要任何特定的语言语法来处理异常,但允许每种语言定义自己的语法。
可跨进程,甚至跨计算机边界引发异常。
可以将异常处理代码添加到应用程序以提高程序可靠性。
异常比其他错误通知方法(例如返回代码)具有优势。 失败不会被忽视,因为如果引发异常且未处理异常,运行时将终止应用程序。 由于代码无法检查故障返回代码,无效值不会继续传播到系统中。
常见异常
下表列出了一些常见异常,其中包含可能导致这些异常的原因的示例。
异常类型 | DESCRIPTION | 示例: |
---|---|---|
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); |