为什么 Java 人员经常默默地使用异常?

2022-08-31 12:17:44

我以前从未做过任何严肃的Java编码,但我根据我现有的技能学习了语法,库和概念(Delphi&C#)。我几乎不明白的一件事是,我见过太多的代码,它们在这样之后默默地使用异常:printStackTrace

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

在我遇到的几乎每篇Java文章和项目中都有类似的代码。根据我的知识,这是非常糟糕的。异常几乎总是应该转发到外部上下文,如下所示:

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            e.printStackTrace();
            throw new AssertionError(e);
        }
    }

大多数时候,异常最终应该在属于底层框架的最外层循环(例如Java Swing)中处理。为什么在Java世界中编写这样的代码看起来像是常态?我很困惑。

根据我的背景,我宁愿完全删除printStackTrace。我会简单地将其作为未处理的 aka(或者,甚至更好)重新抛出,然后在最合适的位置捕获并记录它:框架最外层的循环。RuntimeExceptionAssertionError

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            throw new AssertionError(e);
        }
    }

答案 1

我一直认为,这类似于以下场景:

“一名男子被枪杀。

他屏住呼吸,有足够的力量坐公共汽车。

10英里后,这名男子下了公共汽车,走了几个街区就死了。

当警察到达尸体时,他们不知道刚刚发生了什么。他们最终可能会这样做,但这要困难得多。

更好的是:

“一名男子被枪杀,他立即死亡,尸体恰好位于谋杀案刚刚发生的地方。

当警察到达时,所有的证据都已到位。

如果一个系统要失败,最好是快速失败

解决以下问题:

  1. 无知。
      +
  2. 懒惰

编辑:

当然,捕获部分是有用的。

如果可以做一些例外的事情,那就是应该完成的地方。

对于给定的代码来说,这可能不是一个例外,可能是预期的(在我的类比中就像一件防弹夹克,而这个人首先在等待射击)。

是的,catch 可用于抛出适合于抽象的异常


答案 2

通常,这是因为 IDE 提供了一个有用的“快速修复”,该修复程序将有问题的代码包装在具有该异常处理的 try-catch 块中。这个想法是,你实际上做了一些事情,但懒惰的开发人员没有。

毫无疑问,这是糟糕的形式。


推荐