异常是在程序执行期间发生的意外事件。例如,
int divideByZero = 7 / 0;
以上代码会引发一个异常,因为一个数字不能被 0 整除。
让我们详细学习 C# 异常。
C# 异常层次结构

上图显示了 C# 中的异常层次结构。C# 提供了一个名为 Exception
的基类,该基类随后派生出其他类。
从 Exception
类派生的两大主要异常类是:
SystemException
- 也称为内置异常ApplicationException
- 也称为用户定义异常
让我们详细了解它们。
C# 内置异常
内置异常也称为 SystemException
异常。在 C# 中,所有内置异常类都派生自 SystemException
类。此类处理所有与系统相关的异常。
一些常见的系统异常包括:
1. StackOverflowException
- 当执行堆栈超出堆栈大小时,将引发此异常。通常在程序中使用无限循环时发生。
2. ArithmeticException
- 当算术、类型转换或转换中出现错误时,将引发此异常。它是异常类的基类,例如:
DivideByZeroException
- 当整数除以 **0** 时,将引发此异常。例如,当我们尝试执行 **5** 除以 **0** 时。
NotFiniteNumberException
- 当浮点值的正无穷大、负无穷大或 NaN(非数字)时,将引发此异常。
OverFlowException
- 当操作产生的计算结果超出范围时,将引发此异常。例如,
3. ValidationException
- 当输入值无效时,将引发此异常。例如,如果我们输入一个整数值到期望 DateTime
值的字段,将引发此异常。
4. ArgumentException
- 当我们在方法中提供了一个无效参数时,将引发此异常。例如,当我们在方法调用期间传递的数据类型与指定的参数不匹配时,会发生此异常。
示例:C# SystemException
using System;
class Program
{
// an array containing string values
static string[] colors = { "Red", "Green", "Pink" };
static void Main()
{
// print the array element present at 3rd index position
Console.WriteLine(colors[3]);
}
}
输出
Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array.
在上面的示例中,我们试图访问 colors
数组元素的索引 **3**。
由于索引 **3** 处没有元素,程序将引发系统异常 IndexOutOfRangeException
。
C# 用户定义异常
到目前为止,我们已经了解了 C# 中的内置异常。我们还可以创建用户定义的异常,也称为应用程序级别异常。
ApplicationException
类是我们可以从中派生应用程序级别异常的基类。
假设我们想在应用程序中创建一个不允许参与者年龄超过 **18** 岁的异常。我们将其命名为 InvalidAgeException
。
要创建 InvalidAgeException
异常,我们将其从 ApplicationException
类派生,如下所示:
// user-defined exception class derived from
// the ApplicationException base class
class InvalidAgeException : ApplicationException
{
// constructor for the InvalidAgeException class
InvalidAgeException()
{
Console.WriteLine("Exception occurred: Invalid Age");
}
}
在这里,我们定义了一个名为 InvalidAgeException
的用户定义异常类,它派生自 ApplicationException
类。
我们可以在用户定义的 InvalidAgeException
类中编写自定义代码,并定义该异常类的性质。
现在,每当违反年龄限制时,我们都可以引发 InvalidAgeException
异常。
C# 错误与异常
错误表示条件,例如编译错误、语法错误、代码逻辑部分错误、库不兼容、无限递归等。
错误通常超出了程序员的控制范围,我们不应该尝试处理错误。
异常可以被程序捕获和处理。
现在我们已经了解了异常,我们将在下一个教程中学习 外部处理。