我是否应该捕获日志记录的异常?
public foo(..) { try { ... } catch (Exception ex) { Logger.Error(ex); throw; } }
如果我在每个层(DataAccess,Business和WebService)中都有这个,这意味着会多次记录异常.
如果我的图层在单独的项目中并且只有公共接口中有try/catch,那么这样做是否有意义?为什么?为什么不?我可以使用不同的方法吗?
当然不.你应该找到处理异常的正确位置(实际上做一些事情,比如catch-and-not-rethrow),然后记录它.当然,您可以而且应该包括整个堆栈跟踪,但是根据您的建议,将使用try-catch块来丢弃代码.
除非您要更改异常,否则只应记录要处理错误的级别,而不是重新抛出它.否则,您的日志只会有一堆"噪音",记录3条或更多相同的消息,每层一次.
我的最佳做法是:
只在公共方法中尝试/捕获(一般情况下;显然如果你要捕获一个特定的错误,你会在那里检查它)
只有在压缩错误并重定向到错误页面/表单之前才能登录UI层.
一般的经验法则是,如果你真的可以做一些事情,你只会遇到异常.所以在业务或数据层,你只会在这样的情况下捕获异常:
try { this.Persist(trans); } catch(Exception ex) { trans.Rollback(); throw ex; }
我的业务/数据层尝试保存数据 - 如果生成异常,则回滚任何事务并将异常发送到UI层.
在UI层,您可以实现一个常见的异常处理程序:
Application.ThreadException + = new ThreadExceptionEventHandler(Application_ThreadException);
然后处理所有异常.它可能会记录异常,然后显示用户友好的响应:
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { LogException(e.Exception); } static void LogException(Exception ex) { YYYExceptionHandling.HandleException(ex, YYYExceptionHandling.ExceptionPolicyType.YYY_Policy, YYYExceptionHandling.ExceptionPriority.Medium, "An error has occurred, please contact Administrator"); }
在实际的UI代码中,如果要执行不同的操作,可以捕获单个异常 - 例如显示不同的友好消息或修改屏幕等.
另外,作为提醒,总是尝试处理错误 - 例如除以0 - 而不是抛出异常.