最近,我一直在阅读如何正确处理异常以改进我的软件(避免捕获通用异常等),但我仍然有点困惑。这就是我目前所做的事情(这违反了一些良好做法,或者可能全部做法)
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.
}
此外,还有一个全局错误消息,将用户重定向到通用的“联系人管理员”错误页面。
从我读过的所有内容来看,似乎我做错了。在这种情况下,使用上面的示例,我应该如何在每个级别正确处理异常?
答案 0 :(得分:1)
我相信你不应该在DAL或业务层之类的任何内层(造型洋葱层)中捕获异常,除非您需要对除记录之外的异常做一些事情。
我相信所有异常应该冒泡到最外层,可以是你的web层或控制台项目。基本上,您的启动或执行模块/项目应负责在一个地方处理和记录异常。
对于ASP .NET MVC,我会在自定义HandleErrorAttribute
下进行,如果需要,也可以在Application_Error
文件的global.asax
下进行。