检查编译器生成的异常
- 10 分钟
异常由 .NET 运行时或程序中的代码生成。 异常类型依赖于导致异常的代码。
编译器生成的异常
当基本操作失败时,.NET 运行时会引发异常。 下面是运行时异常及其错误条件的简短列表:
ArrayTypeMismatchException
:当数组无法存储给定元素时引发,因为该元素的实际类型与数组的实际类型不兼容。DivideByZeroException
:尝试将整数值除以零时引发。FormatException
:参数格式无效时引发。IndexOutOfRangeException
:在索引小于零或超出数组边界的情况下,尝试为数组编制索引时引发。InvalidCastException
:当从基类型到接口或派生类型的显式转换在运行时失败时引发。NullReferenceException
:尝试引用值为 null 的对象时引发。OverflowException
:当被选中上下文中的算术运算溢出时引发。
编译器生成的异常的代码示例
下面的代码示例演示导致编译器生成的异常的代码示例。
数组类型不匹配异常
当尝试在数组中存储错误类型的元素时,将引发类型的 ArrayTypeMismatchException
异常。 以下示例在尝试在字符串数组中存储数值时引发 ArrayTypeMismatchException
异常。
string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;
Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs
DivideByZeroException
尝试将整数或十进制数除以零时,会发生类型的 DivideByZeroException
异常。 以下示例在执行整数除法时引发 DivideByZeroException
异常。
int number1 = 3000;
int number2 = 0;
Console.WriteLine(number1 / number2); // DivideByZeroException occurs
注释
将浮点值除以零不会引发异常;它根据 IEEE 754 算术规则,产生正无穷大、负无穷大或非数字(NaN)。
FormatException
当参数的格式无效或复合格式字符串格式不正确时,会发生类型的 FormatException
异常。 以下示例在尝试将字符串转换为整数时引发 FormatException
异常。
int valueEntered;
string userValue = "two";
valueEntered = int.Parse(userValue); // FormatException occurs
IndexOutOfRangeException
当尝试访问具有超出其边界的索引的数组或集合的元素时,将引发类型的 IndexOutOfRangeException
异常。 以下示例在尝试将 values1
数组的最后一个元素赋值给 values2
数组的最后一个元素时引发 IndexOutOfRangeException
异常。
int[] values1 = { 3, 6, 9, 12, 15, 18, 21 };
int[] values2 = new int[6];
values2[values1.Length - 1] = values1[values1.Length - 1]; // IndexOutOfRangeException occurs
InvalidCastException
尝试进行无效的强制转换或显式转换时,将引发类型为 InvalidCastException
的异常。 以下示例会在尝试将 object
类型的字符串强制转换为 int
变量时引发 InvalidCastException
。
object obj = "This is a string";
int num = (int)obj;
NullReferenceException
尝试访问其值为 null 的类型上的成员时,将引发类型的 NullReferenceException
异常。 显示了两个示例。 首个示例中,当尝试访问空数组的元素时,会抛出 NullReferenceException
。 第二个示例在尝试访问空字符串的方法时抛出NullReferenceException
。
int[] values = null;
for (int i = 0; i <= 9; i++)
values[i] = i * 2;
string? lowCaseString = null;
Console.WriteLine(lowCaseString.ToUpper());
OverflowException
当算术运算尝试分配超出目标数据类型范围的结果时,会发生类型的 OverflowException
异常。 以下示例在尝试将decimal
值400转换为byte
变量时抛出OverflowException
异常。
decimal x = 400;
byte i;
i = (byte)x; // OverflowException occurs
Console.WriteLine(i);
回顾
在本单元中,应谨记以下几个重要事项:
- 当操作失败时,.NET 运行时将引发异常。
- 异常类型依赖于导致异常的代码。
- 应用程序应捕获运行时异常。