.NET的错误处理机制是一套覆盖编译时错误、运行时异常、全局错误捕获的多层级方案,核心围绕异常类型体系、结构化异常处理语法、全局错误事件等多个维度展开,帮助开发者精准定位和修复程序运行中的问题。

.NET错误类型划分
.NET中的错误主要分为两类,不同类型的错误对应不同的处理策略:
- 编译时错误:由代码语法不符合规范、类型不匹配、引用缺失等问题引发,在代码编译阶段就会被编译器识别,无法通过编译,需要开发者修改代码后才能生成可执行程序。
- 运行时异常:程序编译通过后,运行过程中出现的错误,比如空引用、除零操作、文件不存在、网络连接失败等,这类错误需要通过运行时错误处理机制捕获处理。
核心异常处理语法:Try-Catch-Finally
Try-Catch-Finally是.NET最基础的异常处理结构,用于捕获和处理代码块中抛出的异常,语法结构如下:
using System;
class Program
{
static void Main()
{
// try块放置可能抛出异常的代码
try
{
int a = 10;
int b = 0;
int result = a / b; // 此处会抛出DivideByZeroException异常
Console.WriteLine($"计算结果:{result}");
}
// catch块捕获指定类型的异常,可多个catch块按顺序匹配
catch (DivideByZeroException ex)
{
Console.WriteLine($"捕获到除零异常:{ex.Message}");
}
catch (Exception ex)
{
// 捕获所有未匹配到的异常类型
Console.WriteLine($"捕获到其他异常:{ex.Message}");
}
// finally块无论是否发生异常都会执行,常用于释放资源
finally
{
Console.WriteLine("finally块执行完毕");
}
}
}
使用这个结构时需要注意,catch块的匹配顺序是从具体到通用,所以具体的异常类型要放在通用的Exception类型之前,否则具体的catch块永远不会被触发。
Exception异常类体系
.NET所有运行时异常都继承自System.Exception基类,常见的内置异常类型包括:
| 异常类型 | 触发场景 |
|---|---|
| NullReferenceException | 尝试访问空对象的成员时触发 |
| IndexOutOfRangeException | 数组或集合的索引超出有效范围时触发 |
| FileNotFoundException | 尝试访问不存在的文件时触发 |
| ArgumentException | 传递给方法的参数不符合要求时触发 |
开发者也可以自定义异常类型,只需要继承Exception类即可,示例如下:
using System;
// 自定义异常类
public class CustomException : Exception
{
public CustomException(string message) : base(message)
{
}
}
class Program
{
static void Main()
{
try
{
throw new CustomException("这是自定义异常信息");
}
catch (CustomException ex)
{
Console.WriteLine($"捕获到自定义异常:{ex.Message}");
}
}
}
全局错误处理机制
除了代码块内的局部异常捕获,.NET还提供了全局错误捕获方案,用于处理未被局部catch捕获的异常:
控制台应用全局错误捕获
控制台应用可以订阅AppDomain.CurrentDomain.UnhandledException事件,捕获所有未处理的异常:
using System;
class Program
{
static void Main()
{
// 订阅全局未处理异常事件
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
Exception ex = e.ExceptionObject as Exception;
Console.WriteLine($"全局捕获到未处理异常:{ex?.Message}");
};
// 抛出未被局部捕获的异常
throw new Exception("未处理的测试异常");
}
}
ASP.NET应用全局错误捕获
ASP.NET Web Forms应用可以在Global.asax中处理Application_Error事件,ASP.NET Core应用可以通过中间件统一捕获异常:
// ASP.NET Core异常中间件示例
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System;
using System.Threading.Tasks;
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
context.Response.StatusCode = 500;
await context.Response.WriteAsync($"服务器处理出错:{ex.Message}");
}
}
}
// 扩展方法注册中间件
public static class ErrorHandlingMiddlewareExtensions
{
public static IApplicationBuilder UseErrorHandling(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ErrorHandlingMiddleware>();
}
}
错误处理最佳实践
- 不要捕获异常后不做任何处理,至少要记录异常信息,方便后续排查问题。
- 只捕获你能够处理的异常类型,不要滥用通用的Exception捕获所有异常。
- 使用finally块释放文件、数据库连接、网络连接等资源,避免资源泄漏。
- 自定义异常时,异常类名要以Exception结尾,符合.NET的命名规范。
- 不要依赖异常处理来处理正常的业务逻辑,比如用异常判断输入是否合法,这会影响程序性能。
合理的错误处理能让程序在出现问题时给出友好的提示,同时保留足够的排查信息,是提升应用质量的关键环节。
.NET异常处理Error事件TryCatchFinallyException类修改时间:2026-06-24 21:12:34