【问题标题】:Web app, what is the proper way to catch exceptions, using the example here?Web应用程序,使用此处的示例捕获异常的正确方法是什么?
【发布时间】:2013-11-27 18:59:27
【问题描述】:

最近,我一直在阅读如何正确处理异常以改进我的软件(避免捕获通用异常等),但我仍然有点困惑。这是我目前所做的(违反了一些好的做法,或者可能是全部)

ASP.NET Web 应用程序调用业务层,而后者又调用数据访问层。使用的日志框架是 log4net,只要记录了异常,它就会给我发电子邮件。

数据访问层捕获通用异常(是的,不好,因为我不知道网络是否可能是问题,或者存储过程的输入是否是错误类型等)将其记录为致命然后“扔;” (以保留堆栈跟踪)。

catch(Exception ex)
{
    log.Fatal("Exception occurred while inserting task into database",ex);
    throw;
}

*注意,我的数据访问层假设所有输入验证都在上层完成,但有时,我错过了检查一两个参数。

业务层也捕获“通用”异常(包括来自数据访问的异常),然后包装一个新异常,如

    catch(Exception ex)
{  
    log.Fatal("Exception occurred while creating the task ", ex);
    throw new exception("There appears to be an error while doing [name of business operations]", ex) 
}

Web 应用层从业务层捕获任何异常并显示错误消息。

catch(Exception ex)
{
   //show Ex.Message to the user on the current UI. 
}

此外,还有将用户重定向到通用“联系管理员”错误页面的全局错误消息。

从我读过的所有内容来看,似乎我做错了。在这种情况下,使用上面的示例,我应该如何正确处理每个级别的异常?

  • 数据访问
  • 业务层
  • Web 应用程序

【问题讨论】:

    标签: c# exception


    【解决方案1】:

    我相信您不应该在任何内部层(建模洋葱层)中捕获异常,例如 DAL 或业务层,除非您需要对异常进行处理而不是记录日志。

    我相信所有异常都应该上升到最外层,可以是您的 Web 层或控制台项目。基本上,您的启动或执行模块/项目应该负责在一个地方处理和记录异常。

    如果是 ASP .NET MVC,我会在自定义 HandleErrorAttribute 下进行,如果需要,还可以在 global.asax 文件中的 Application_Error 下进行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 2014-09-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多