C# Web应用程序,使用这里的示例,捕获异常的正确方法是什么?

C# Web应用程序,使用这里的示例,捕获异常的正确方法是什么?,c#,exception,C#,Exception,最近,我一直在阅读如何正确处理异常以改进我的软件(避免捕获一般异常和所有异常),但我仍然有点困惑。以下是我目前所做的(这违反了一些好的实践,或者可能是全部) ASP.NET web应用程序调用业务层,业务层反过来调用数据访问层。使用的日志框架是log4net,每当记录异常时,它都会给我发电子邮件 数据访问层捕获一般异常(是的,不太好,因为我不知道网络是否有问题,或者存储过程的输入是否为错误类型,等等),将其记录为致命异常,然后“throw;”(保留堆栈跟踪) *注意,我的数据访问层假设所有输入验

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

ASP.NET web应用程序调用业务层,业务层反过来调用数据访问层。使用的日志框架是log4net,每当记录异常时,它都会给我发电子邮件

数据访问层捕获一般异常(是的,不太好,因为我不知道网络是否有问题,或者存储过程的输入是否为错误类型,等等),将其记录为致命异常,然后“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应用程序

我认为您不应该捕获任何内部层(如DAL层或业务层)中的异常,除非您需要对该异常执行除日志记录之外的其他操作

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


如果是ASP.NET MVC,我会在自定义的
HandleErrorAttribute
下执行,如果需要,也可以在
global.asax
文件中的
Application\u Error
下执行。

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

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

如果是ASP.NET MVC,我会在一个自定义的
HandleErrorAttribute
下执行,如果需要,还可以在
global.asax
文件中的
Application\u Error
下执行

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