捕获和记录不相关的操作

时间:2015-09-21 11:10:36

标签: java exception

我有一种方法来保存每个操作的时间信息:

    public void queueTimerInfo(long start, long end, String msg) {
        try {
            timer.queue(start, end, msg);
        } catch (InterruptedException e) {
            Logger.info(e.getMessage());
        }
    }

我在每次操作后调用上面的方法。重要的是操作本身,而时间只是次要任务。这就是为什么我决定在方法失败时不做任何事情,除了记录它。

但我总是被告知,在不管理异常的情况下进行日志记录是一种不好的做法。那么我应该如何重写上面的代码呢?

4 个答案:

答案 0 :(得分:8)

如果您知道后果,即timer.queue()调用可能被中断而不对数据进行排队,并且您可以使用它,则可以忽略该异常。与大多数规则一样,您需要知道何时打破它们。

但是,我会在catch块中用注释来记录您的决定,以便后来维护代码的人知道不处理异常不是疏忽,而是故意的决定。

答案 1 :(得分:5)

  

但我总是被告知在没有管理异常的情况下进行记录是一种不好的做法

"管理"意思?反思他们?盲目地遵循步骤1,2,3,因为" zOMG抛出异常!! 111"?

如果你盲目地遵循最佳实践和其他各种建议,无论你的背景如何,那么你最终可能会遇到真正有问题和尴尬的决定。不做是因为它是最好的做法。承认最佳实践,但同时确保它们在您的情况下确实有意义。

问问自己:这个异常会有所作为吗?它违反了合同吗?它是否会改变您的申请流程?你绝对不希望这种情况发生吗?如果确实如此,那么情况确实非常特殊,你应该真的以某种方式处理它?<​​/ p>

如果它不会产生影响等等,那么只记录它是完全可以接受的。这真的取决于你的背景和你的例外的重要性。

LE:当然,正如Thomas建议的那样,您可能想要记录您的决定。

答案 2 :(得分:4)

InterruptedException很特别,因为它不会发出错误信号。

当一个方法声明InterruptedException时,它告诉你它是一个阻塞方法,可以通过中断其线程来取消。 Brian Goetz explains

  

当一个方法抛出InterruptedException时,它会告诉你if   执行该方法的线程被中断,它将成为一个   试图阻止它正在做的事情并尽早返回并指出它   通过抛出InterruptedException来提前返回。乖巧的阻止   库方法应该响应中断和抛出   InterruptedException因此可以在可取消的活动中使用   不影响响应能力。

你应该

  • 请勿抓住异常并添加throws InterruptedException
  • 抓住它,清理并重新抛出它
  • 当你无法投掷时(例如在Runnable)来电Thread.getCurrentThread().interrupt();

如果您只是吞下该异常,则会损害您的应用程序的响应能力。

答案 3 :(得分:0)

你能把它包起来并重新抛出吗?然后,您的常见异常处理程序可以处理日志记录和报告。并尽可能提供上下文。