Will an assertion error be caught by in a catch block for java exception?
码:-
1 2 3 4 5
| try {
Assert. assertEquals("1", "2");
} catch (Exception e ) {
System. out. println("I am in error block");
} |
如果断言语句失败,我想捕获catch块中的错误。 我正在尝试上面的代码,它没有发生。
是否会在java异常的catch块中捕获断言错误?
-
你为什么要这样做呢? 这似乎是对Assert的严重滥用,这意味着单元测试
你差不多回答了自己的问题。如果Assert失败,你的catch块将不会捕获Assert抛出的AssertionError,因为它是Error(或者更具体地,它扩展java.lang.Error)。有关详细信息,请参阅文档。 catch块只捕获扩展java.lang.Exception的Throwable对象
如果你真的想抓住它 - 你需要使用
1 2
| catch (AssertionError e) {
... |
但是,正如其他人所提到的,这是使用断言的一种非常不寻常的方式 - 它们通常应该通过,如果它们失败,那么你想要继续执行程序是非常不寻常的。这就是失败抛出Error而不是Exception的原因。您可以在此问题中阅读有关(不)捕获Error的更多信息。
你确定你不只是想要一个测试 - if ( variableName =="1")吗?
注意如果你正在测试单元测试助手代码,比如匹配器,那么抓住AssertionError可能是有意义的。
-
当想要查看单元测试助手类是否正在做正确的事情时(通过单元测试;-)),人们可以期望能够捕获这样的AssertionError。那将是一个有效的情况来抓住它,不是吗?
-
@gkephorus是的,我想它可能是。随意编辑为"N.B."如果你愿意,我会批准它:)
-
@JRichardSnape - 我想比较两个java对象(从json对象获得),它们只有字符串变量和getter&塞特斯,即POJO。我只想比较一些(不是全部)变量来确定匹配。对于其中一个变量,只应比较部分值。将所有断言放入try catch(AssertionError)块是不是一个好主意?这样,我可以在catch部分返回false以指示哪个字段不匹配,并使用有用的错误消息字符串。这样,我不必写几个if else。听起来不错?
-
关于:"如果你正在测试单元测试助手代码,比如匹配器,那么捕获AssertionError可能是有意义的" - 我建议使用org.junit.rules.ExpectedException.handleAssertionErrors()
好吧,我相信您正在使用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");}
如果要同时捕获Exception和Error实例,请使用:
由于Exception和Error都延伸Throwable。
如果您想以这种方式捕获错误,则需要以下内容:
1 2 3
| if (num == 1 || num == 2) {
throw new Exception();
} |
您可以创建自己的异常类并传入所需的消息。