什么是异常
在C#中,异常是程序运行时发生的意外错误或异常情况的表示。它是一种机制,用于在程序执行过程中处理错误,而不是让程序直接崩溃。
根据知识库[3]中的定义:
"在C#中,程序中的运行时错误通过使用一种称为'异常'的机制在程序中传播。异常由遇到错误的代码引发,由能够更正错误的代码捕捉。异常可由.NET运行时或由程序中的代码引发。异常由从Exception派生的类表示。每个类标识异常的类型,并包含详细描述异常的属性。"
异常的关键特性
- 异常是对象 :所有异常都派生自
System.Exception类 - 异常传播:当错误发生时,异常被"抛出",控制流会跳转到最近的异常处理块
- 异常类型 :不同的异常类型表示不同类型的错误(如
DivideByZeroException、NullReferenceException等) - 异常信息:异常对象包含关于错误的详细信息,如错误消息和调用堆栈
异常处理的机制
C#使用try、catch和finally关键字来处理异常:
1. 基本结构
cs
try
{
// 可能引发异常的代码
}
catch (特定异常类型 ex)
{
// 处理异常的代码
}
finally
{
// 无论是否发生异常都会执行的代码
}
2. 异常处理示例
cs
public class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
double a = 98, b = 0;
double result;
try
{
result = SafeDivision(a, b);
Console.WriteLine($"{a} divided by {b} = {result}");
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
3. 多个catch块
cs
try
{
// 可能引发异常的代码
}
catch (ArgumentException e)
{
Console.WriteLine($"Processing failed: {e.Message}");
}
catch (OperationCanceledException)
{
Console.WriteLine("Processing is cancelled.");
}
4. 异常筛选器
cs
try
{
// 可能引发异常的代码
}
catch (Exception e) when (e is ArgumentException || e is DivideByZeroException)
{
Console.WriteLine("Processing failed with specific exception types.");
}
为什么需要异常处理
根据知识库[6]:
"异常处理,英文名为exceptional handling, 是代替日渐衰落的error code方法的新法,提供error code 所未能具体的优势。异常处理分离了接收和处理错误代码。这个功能理清了编程者的思绪,也帮助代码增强了可读性,方便了维护者的阅读和理解。"
异常处理的好处:
- 提高代码的健壮性和可靠性
- 将错误处理逻辑与正常业务逻辑分离
- 使代码更清晰、更易维护
- 允许在错误发生时采取适当的恢复措施
异常处理的最佳实践
- 仅捕获你知道如何处理的异常 :不要捕获
System.Exception而不重新引发它 - 优先捕获最具体的异常类型:先捕获派生类,再捕获基类
- 使用finally清理资源:确保资源(如文件、数据库连接)被正确释放
- 不要使用异常处理来控制程序流程:异常应该用于处理真正的异常情况,而不是常规的控制流
异常的创建
可以使用throw关键字手动创建异常:
cs
throw new DivideByZeroException("除数不能为零");
在C# 6.0及以上版本,还可以使用表达式形式:
cs
public string Name {
get => name;
set => name = value ??
throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
}
异常处理的流程
- 当try块中的代码引发异常时
- CLR(公共语言运行时)会检查调用堆栈
- 查找第一个匹配的catch块
- 执行匹配的catch块中的代码
- 如果没有匹配的catch块,程序将终止并显示错误消息
- 无论是否发生异常,finally块中的代码都会执行
总结
异常是C#中处理运行时错误的重要机制,它使程序能够优雅地处理意外情况,而不是直接崩溃。通过使用try、catch和finally,我们可以确保程序在遇到错误时能够采取适当的措施,提高应用程序的健壮性和用户体验。