当前位置:  开发笔记 > 编程语言 > 正文

我应该捕获异常才能记录它们吗?

如何解决《我应该捕获异常才能记录它们吗?》经验,为你挑选了3个好方法。

我是否应该捕获日志记录的异常?

public foo(..)
{
   try
   {
     ...
   } catch (Exception ex) {
     Logger.Error(ex);
     throw;
   }
}

如果我在每个层(DataAccess,Business和WebService)中都有这个,这意味着会多次记录异常.

如果我的图层在单独的项目中并且只有公共接口中有try/catch,那么这样做是否有意义?为什么?为什么不?我可以使用不同的方法吗?



1> ripper234..:

当然不.你应该找到处理异常的正确位置(实际上做一些事情,比如catch-and-not-rethrow),然后记录它.当然,您可以而且应该包括整个堆栈跟踪,但是根据您的建议,将使用try-catch块来丢弃代码.



2> Guy Starbuck..:

除非您要更改异常,否则只应记录要处理错误的级别,而不是重新抛出它.否则,您的日志只会有一堆"噪音",记录3条或更多相同的消息,每层一次.

我的最佳做法是:

    只在公共方法中尝试/捕获(一般情况下;显然如果你要捕获一个特定的错误,你会在那里检查它)

    只有在压缩错误并重定向到错误页面/表单之前才能登录UI层.



3> Pat..:

一般的经验法则是,如果你真的可以做一些事情,你只会遇到异常.所以在业务或数据层,你只会在这样的情况下捕获异常:

            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 - 而不是抛出异常.


顺便说一句,不要"扔掉"以重新抛出.只要做'throw`否则你将失去原始异常的堆栈跟踪.
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有