当前位置: 首页 > 面试题库 >

尝试捕获:这是可接受的做法吗?

段干弘毅
2023-03-14
问题内容

我们已经从软件供应商处收到Java代码。它包含许多try-catch没有任何catch部分的块。他们到处都是。例:

        try {
            spaceBlock.enable(LindsayModel);
        } catch (Exception e) {
        }

我的问题是:以上做法是否可以接受?如果是这样,什么时候?还是我应该继续删除所有这些“虚假” trycatch陈述?

对我来说,这看起来像是可怕的练习,但是我对Java的经验不足以肯定。如果您不打算对它们做任何事情,为什么会发现它们呢?在我看来,仅当您确信例外绝对不会有后果并且您不在乎是否发生例外时,您才这样做。但是,在我们的特定应用程序中并非如此。

编辑
为了提供一些背景信息:我们从供应商处购买了Java可编写脚本的产品。除了产品,他们还提供了适合我们需求的大型概念验证脚本。该脚本是“免费的”(尽管如果脚本不附带该产品,我们就不会购买),并且它“有效”。但是,由于许多事情甚至连我作为Java新手都认为是糟糕的实践,因此脚本的确难以构建,其中一个例子就是这种虚假的try-
catch业务。


问题答案:

这确实是可怕的做法。特别是捕捉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);
}

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

一个重要的区别是是否使用try / catches吞下了已检查的异常。如果是这种情况,则可能表明程序员方面极度冷漠-
有人只是想编译他/她的代码。至少应修改代码:

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

这将抛出包装在unchecked中的异常RuntimeException,有效地允许代码进行编译。但是,即使这也可以被认为是一个简单的创举-
检查异常的最佳实践是在当前方法中或通过添加throws SpecificCheckedException方法签名来单独处理它们。

就像@Tom Hawtin提到的那样,new Error(sce)可以使用它来代替,new RuntimeException(sce)以避开Exception更进一步的捕获,这对于不希望被抛出的东西是有意义的。

如果不使用try / catch吞下已检查的异常,则同样危险,应将其删除。



 类似资料:
  • 问题内容: 我正在研究纸牌游戏UNO的实现(主要是运行模拟来测试一些内部规则,但这是不同的事情)。 对于从未玩过的人来说,它类似于疯狂八人组。玩家轮流在弃牌堆上玩纸牌。卡必须在编号或颜色上匹配。也有抽奖牌,迫使下一个玩家抽两张或四张牌。内部规则也非常友好,这使其非常有趣。 我的卡的和一起上课。我想做的是创建扩展。然后,在确定游戏机制时,我将用来测试是否具有。 我知道这通常是有问题的,但这对我来说似

  • 我想要做的是让用户输入年龄,让程序使用getter和setter,同时检查异常,如果它捕捉到异常,则必须再次运行该方法。 导入java。util。扫描仪; 公共课主课{ //患者类 导入java。util。输入不匹配异常;导入java。util。扫描仪; 公共类测试病人{private int age; }

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 不存在从“lambda[]void(GLFWwindow*window,int key,int scancode,int action,int mods)->void”到glfwkeyfun“的适当转换函数 我是漏掉了什么还是这段代码只是无效?

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 我很好奇在try块中使用return语句的最佳实践。 我有一个调用服务方法的方法,该方法返回一个整数,并可能抛出一个IllegalArgumentException。有两种方法可以做到这一点。 第一: 第二: 在第二种方法中,计数变量似乎是不必要的,但出于某种原因,第一种方法在我看来是错误的。有什么特别的理由偏袒一方而不是另一方吗?