【问题标题】:Will an assertion error be caught by in a catch block for java exception?java异常的catch块中是否会捕获断言错误?
【发布时间】:2015-06-22 16:29:27
【问题描述】:

代码:-

try {
    Assert.assertEquals("1", "2");
} catch (Exception e) {
    System.out.println("I am in error block");
}

如果断言语句失败,我想在 catch 块中捕获错误。我正在尝试使用上面的代码,但它没有发生。

断言错误会被 java 异常的 catch 块捕获吗?

【问题讨论】:

  • 你为什么要这样做呢?这似乎是对用于单元测试的Assert 的严重滥用

标签: java junit try-catch assert


【解决方案1】:

好吧,我相信您正在使用 JUnit 来编写测试。在这种情况下,你不应该抓住你的Assert.assertEquals(),因为它们应该通过正常的测试执行。如果它抛出任何异常,则意味着您的代码没有按应有的方式执行。

【讨论】:

  • 是的,我的断言代码引发了异常。但是我想通过 Exception 类捕获所有错误,例如断言或任何其他错误。我该怎么做?
  • 你不能。 AssertionError 继承自 Error,这意味着 try...catch 将无法处理它们。见这里docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html。如果您无论如何都需要抓住它们,请参阅 SpaceCowboy 的回答。
  • @Aakash 不正确 - 这工作正常:try { throw new AssertionError(); } catch( AssertionError e){ System.out.println("ok");}
  • @danyamachine 正如我所说,我们不应该在这件事上抓不到AssertionError 或任何Error。错误是告诉开发人员发生了错误并且程序不应该继续。这是一个迟到的回复,但迟到总比没有好:)
【解决方案2】:

如果您想以这种方式捕获错误,则需要以下内容:

if (num == 1 || num == 2) {
    throw new Exception();
}

您可以创建自己的异常类并传入您想要的消息。

【讨论】:

    【解决方案3】:

    您几乎已经回答了自己的问题。如果失败,您的 catch 块将不会捕获 Assert 抛出的 AssertionError,因为它是 Error(或者,更具体地说,它扩展了 java.lang.Error)。 See the docs 了解更多信息。您的 catch 块仅捕获扩展 java.lang.ExceptionThrowable 对象

    如果你真的想抓住它 - 你需要使用

    catch (AssertionError e) {
    ...
    

    然而,因为othersmentioned,这是使用断言的一种非常不寻常的方式——它们通常应该通过,如果失败则非常不寻常供您进行程序执行。这就是失败抛出Error 而不是Exception 的原因。您可以在this question 中阅读有关(不)捕获Error 的更多信息。

    你确定你不只是想要一个测试 - if ( variableName == "1")

    注意如果您正在测试单元测试帮助代码,例如匹配器,捕获AssertionError 可能是有意义的。

    【讨论】:

    • 当一个人想看看一个单元测试助手类是否在做正确的事情(通过单元测试它;-))人们会期望能够捕捉到这样一个 AssertionError。那将是捕捉它的有效情况,不是吗?
    • @gkephorus 是的,我想可能是这样。随意将其编辑为“N.B.”如果你喜欢,我会批准的:)
    • @JRichardSnape - 我想比较两个 java 对象(从 json 对象获得),它们只有带有 getter 和 setter 的字符串变量,即 POJO。我只想比较一些(不是全部)变量来确定匹配。对于其中一个变量,只应比较部分值。将我的所有断言放入 try catch(AssertionError) 块中是个好主意吗?这样,我可以在 catch 部分返回 false 以指示哪个字段不匹配,并带有有用的错误消息字符串。这样,我就不用写几个 if else 了。听起来不错?
    • 关于:"注意,如果您正在测试单元测试帮助代码,例如匹配器,捕获 AssertionError 可能是有意义的" - 我建议使用 @ 987654338@
    • catch (AssertionError e) { } 在我的情况下没有被调用。你不应该抓住AssertionError 是这里的口头禅。
    【解决方案4】:

    如果您想同时捕获 ExceptionError 实例,请使用:

    ...
    catch (Throwable t)
    {
    ...
    }
    

    因为ExceptionError 都扩展了Throwable

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多