Try-catch:这是可接受的做法吗?

Jea*_*ett 12 java error-handling try-catch

我们收到了软件供应商提供的Java代码.它包含很多try-catch块,catch零件中没有任何东西.他们到处都是.例:

        try {
            spaceBlock.enable(LindsayModel);
        } catch (Exception e) {
        }
Run Code Online (Sandbox Code Playgroud)

我的问题是:上述可接受的做法是否合适?如果是的话,何时?或者我应该继续删除所有这些"虚假" trycatch陈述?

对我而言,这看起来像是一种糟糕的做法,但我在Java中没有足够的经验来确定.如果你不打算对它们做任何事情,为什么会发现错误?在我看来,如果您确信异常绝对没有任何后果,并且您不关心是否发生异常,那么您只会这样做.但是,在我们的特定应用中并非如此.

编辑提供一些背景信息:我们从供应商那里购买了一个Java脚本的产品.除产品外,他们还根据我们的需求提供了大量的概念验证脚本.这个脚本是"免费的"(虽然我们不会购买产品,如果它没有附带脚本),它"工作".但是脚本是一个真正的痛苦,因为很多东西,即使我作为Java新手认为是可怕的做法,一个例子是这个虚假的尝试捕获业务.

Pau*_*ora 19

这确实是一种可怕的做法.特别是捕捉Exception而不是特定的东西会散发出可怕的气味 - 甚至NullPointerException会被吞噬.即使确保特定抛出的异常没有真正的后果,也应该始终记录它:

try {
    // code
}
catch (MyInconsequentialException mie) {
   // tune level for this logger in logging config file if this is too spammy
   MY_LOGGER.warning("Caught an inconsequential exception.", mie);
}
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,异常不可能完全没有意义.我建议确切地研究应用程序代码打算在这里吞下的异常,以及它们对执行的真正含义.

一个重要的区别是try/catches是否用于吞下已检查的异常.如果是这种情况,它可能表示对程序员非常冷漠 - 有人只是想让他/她的代码编译.至少,代码应该修改:

try {
   // code
}
catch (SpecificCheckedException sce) {
   // make sure there is exception logging done farther up
   throw new RuntimeException(sce);
}
Run Code Online (Sandbox Code Playgroud)

这将重新抛出未经检查的包装异常RuntimeException,有效地允许代码编译.即使这可以被认为是一个绑带 - 但是,检查异常的最佳做法是在当前方法中单独处理它们,或者通过添加throws SpecificCheckedException方法签名来进一步处理它们.

正如@Tom Hawtin所提到的,new Error(sce)可以用来代替,new RuntimeException(sce)以避免任何额外的Exception捕获更远,这对于预计不会抛出的东西是有意义的.

如果没有使用try/catch来吞下已检查的异常,那么它同样很危险,应该简单地删除.

  • "我建议研究究竟是什么......"如果一个已经离职的同事创建了这个代码,我同意.对于一个仍然在场的同事,我会把它归还给他们并告诉*他们*修复它.但这是"来自软件供应商",所以我拒绝它,告诉*他们*修复它,推迟付款直到他们有,并且*永远不会再次使用它们. (2认同)

duf*_*ymo 8

确实可怕.吞下像这样的例外可能很危险.你怎么知道发生了什么坏事?

如果供应商写评论来记录并承认它("我们知道我们在做什么"),我会感觉更好.如果代码中有明显的策略来处理后果,我会感觉更好.将它包装在RuntimeException中并重新抛出; 将返回值设置为适当的值.什么!

"到处都是"?是否有多个try/catch块乱丢代码?就个人而言,我不喜欢那个成语.我更喜欢每种方法一种.

也许你应该找一个新的供应商或自己编写.