63、.NET 异常处理

在.NET框架中,异常处理是管理运行时错误的核心机制。以下是.NET异常处理的全面概述:

异常层次结构

.NET中的所有异常都继承自System.Exception基类,主要异常类别包括:

  • 系统异常:由CLR抛出(如NullReferenceException)
  • 应用程序异常:由应用程序代码抛出
  • 自定义异常:开发者定义的特定业务异常

异常处理关键字

csharp 复制代码
try
{
    // 可能抛出异常的代码
}
catch (SpecificException ex) when (condition) // C# 6.0+ 异常过滤器
{
    // 处理特定异常
}
catch (Exception ex)
{
    // 处理所有其他异常
}
finally
{
    // 清理代码,无论是否发生异常都会执行
}

常见系统异常

异常信息 描述
System.NullReferenceException 尝试访问null对象的成员
System.IndexOutOfRangeException 数组或集合访问越界
System.ArgumentException 方法接收到无效参数
System.InvalidOperationException 对象状态不适合调用方法
System.IO.IOException 输入/输出操作失败
System.TimeoutException 操作超时
System.NotSupportedException 调用了不支持的方法

抛出异常

csharp 复制代码
// 抛出新异常
throw new InvalidOperationException("操作无效");

// 重新抛出当前异常(保留原始堆栈跟踪)
throw;

// 包装异常(保留原始异常作为内部异常)
throw new CustomException("高级错误消息", innerException);

创建自定义异常

csharp 复制代码
[Serializable] // 支持序列化
public class CustomBusinessException : Exception
{
    public CustomBusinessException() : base("默认业务异常消息") { }
    public CustomBusinessException(string message) : base(message) { }
    public CustomBusinessException(string message, Exception innerException) 
        : base(message, innerException) { }
    
    // 可选:实现序列化构造函数
    protected CustomBusinessException(SerializationInfo info, StreamingContext context)
        : base(info, context) { }
}

异常处理最佳实践

  • 具体优先:先捕获具体异常,再捕获一般异常
  • 避免空catch块:至少记录异常信息
  • 资源清理:使用finally或using语句
  • 不要滥用异常:异常应用于异常情况,而非控制流程
  • 提供上下文信息:在自定义异常中包含有用的业务上下文
  • 考虑性能:异常处理比正常流程开销大

高级异常处理技术

1. 异常策略(Enterprise Library等)

csharp 复制代码
// 使用策略处理异常(示例)
ExceptionPolicy.HandleException(exception, "Business Policy");

2. 异常屏蔽(ASP.NET Core)

csharp 复制代码
// 在中间件中处理全局异常
app.UseExceptionHandler("/error");

3. 异步异常处理

csharp 复制代码
try
{
    await SomeAsyncMethod();
}
catch (TaskCanceledException ex)
{
    // 处理取消操作
}

日志记录集成

csharp 复制代码
try
{
    // 业务代码
}
catch (Exception ex)
{
    logger.LogError(ex, "发生业务异常");
    throw new CustomBusinessException("处理失败", ex);
}

异常处理与依赖注入

在ASP.NET Core等框架中,可以利用DI进行异常处理:

csharp 复制代码
// 注册异常处理服务
services.AddScoped<IExceptionHandler, CustomExceptionHandler>();

// 在控制器中使用
public class MyController : Controller
{
    private readonly IExceptionHandler _exceptionHandler;
    
    public MyController(IExceptionHandler exceptionHandler)
    {
        _exceptionHandler = exceptionHandler;
    }
    
    public IActionResult DoSomething()
    {
        try { /* ... */ }
        catch (Exception ex) { return _exceptionHandler.Handle(ex); }
    }
}

跨平台考虑

在.NET Core/.NET 5+中,异常处理与平台无关,但需要注意:

  • 某些平台特定异常可能在不同OS上有不同行为
  • 文件路径异常在不同文件系统上表现可能不同
  • 序列化异常时要考虑跨平台兼容性

正确理解和应用异常处理是构建健壮、可维护.NET应用程序的关键部分。

相关推荐
zlinear数据采集卡10 小时前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel12 小时前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡13 小时前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
kingwebo'sZone14 小时前
C# 根据公式计算的方法
开发语言·c#
阿部多瑞 ABU15 小时前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D15 小时前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram1 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜1 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss
淡海水2 天前
01-05-运行时-JIT优化全景-内联去虚拟化边界检查消除
windows·c#·虚拟化·jit·内联·边界检查消除
波波0072 天前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#