You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类库项目中能否统一处理全局异常?避免Catch块代码重复

类库中统一处理通用异常的方案

当然可以,类库项目完全能实现通用异常的统一处理,核心是把重复的异常逻辑抽离封装,让业务代码只聚焦核心功能,避免冗余的catch块代码。下面是几种落地方案:

1. 封装通用异常处理工具类

写一个静态工具类,把日志记录、异常转换、信息格式化这类重复逻辑打包成方法,业务代码里的catch块直接调用即可。

示例代码(C#):

public static class ExceptionHandler
{
    public static void HandleGeneralException(Exception ex, string operationContext = "")
    {
        // 通用逻辑:写入错误日志
        LogHelper.Error($"[{operationContext}] 执行出错:{ex.Message}", ex);
        
        // 可选:转换为自定义业务异常抛出,给上层统一处理
        throw new LibraryBusinessException("操作失败,请稍后重试", ex);
    }
}

业务代码调用:

try
{
    // 执行文件读取逻辑
}
catch (IOException ex)
{
    ExceptionHandler.HandleGeneralException(ex, "配置文件读取");
}
catch (UnauthorizedAccessException ex)
{
    ExceptionHandler.HandleGeneralException(ex, "权限验证");
}

2. 用AOP实现全局异常拦截

如果类库依赖AOP框架(比如Castle DynamicProxy、Autofac AOP扩展),可以通过切面拦截方法执行,自动捕获并处理异常,业务代码甚至不用写try-catch。

示例伪代码(Castle DynamicProxy):

public class GlobalExceptionInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        try
        {
            invocation.Proceed(); // 执行目标业务方法
        }
        catch (Exception ex)
        {
            // 统一处理逻辑:日志记录、异常包装
            LogHelper.Error($"方法 {invocation.Method.Name} 执行异常:{ex}", ex);
            throw new LibraryBusinessException("业务操作异常", ex);
        }
    }
}

之后给需要拦截的类或方法绑定这个拦截器,调用时异常会自动被捕获处理。

3. 自定义异常+内部转换

在类库中定义专属的自定义异常,内部捕获底层通用异常(如IO、数据库异常)后,统一转换为自定义异常抛出,上层调用方只需捕获这一种异常即可。

示例:

// 类库自定义异常
public class LibraryException : Exception
{
    public int ErrorCode { get; }

    public LibraryException(string message, int errorCode, Exception innerException = null) 
        : base(message, innerException)
    {
        ErrorCode = errorCode;
    }
}

// 类库业务方法
public void ImportData(string filePath)
{
    try
    {
        // 执行文件导入逻辑
    }
    catch (FileNotFoundException ex)
    {
        throw new LibraryException("导入文件不存在", 1001, ex);
    }
    catch (InvalidDataException ex)
    {
        throw new LibraryException("文件格式错误", 1002, ex);
    }
}

上层调用方只需统一捕获LibraryException,根据错误码做对应处理,不用关心底层具体异常类型。

注意事项

  • 避免捕获所有异常:只处理可预见的通用异常,保留OutOfMemory这类致命异常让上层应用处理。
  • 带上上下文信息:统一处理时要附加操作场景(如方法名、业务动作),方便排查问题。
  • 明确异常契约:给类库的调用方说明会抛出哪些自定义异常、对应错误场景,避免处理混乱。

内容的提问来源于stack exchange,提问作者Ara Ghukasyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:45:41