使用此处的示例,Web应用程序,捕获异常的正确方法是什么?

时间:2013-11-27 18:59:27

标签: c# exception

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

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. 
}

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

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

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

1 个答案:

答案 0 :(得分:1)

我相信你不应该在DAL或业务层之类的任何内层(造型洋葱层)中捕获异常,除非您需要对除记录之外的异常做一些事情。

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

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