对于抛出异常被认为是反模式的每个语句,是try/catch吗?

Bja*_*sen 8 java exception-handling anti-patterns exception

我目前正在审查同事的Java代码,我看到很多情况下,每个可能抛出异常的语句都被封装在自己的try/catch中.catch块都执行相同的操作(哪个操作与我的问题无关).

对我而言,这似乎是一种代码味道,我记得在阅读它是一种常见的反模式.但是我找不到任何关于此的参考.

因此,每个抛出的异常语句都会尝试使用try/catch,异常会被认为是反模式,支持这种情况的论据是什么?


构造示例:(与原始问题无关,所以请不要介意此示例中的其他问题,因为它只是为了说明我的意思而构建的.)

public int foo()
{
    int x, y = 7;

    try
    {
        x = bar(y);
    }
    catch(SomeException e)
    {
        return 0;
    }

    try
    {
        y = baz(x,y);
    }
    catch(SomeOtherException e)
    {
        return 0;
    }

    /* etc. */

    return y;
}
Run Code Online (Sandbox Code Playgroud)

(假设在这里捕获两个异常是合适的,即我们知道它们是做什么的,并且适当的是在两种情况下都返回0.)

Pét*_*rök 6

我无法使用权​​威来源为您服务,但这些是异常处理的基本原则:

  • 应该在可以正确处理它们的时候捕获异常,并且
  • 你不能吞下异常 - 应该总是(至少)抛出一个异常的痕迹,所以最小的是记录它,这样至少开发人员有机会注意到发生了一些不好的事情.这导致了第三点:
  • 异常应仅用于表示异常的不良事件,而不是用于控制程序流.

有很多关于SO的早期帖子处理这个问题,例如JAVA或C#中的异常管理的最佳实践.