Java, try-finally without catch
Java, try-finally without catch
我正在使用 class 生成器的这种方法:
public void executeAction(String s) throws MyException {
if (s.equals("exception"))
throw new MyException("Error, exception", this.getClass().getName());
}
public void close() {
System.out.println("Closed");
}
我在这段代码中使用了它们:
public void execute() throws MyException
Generator generator = new Generator();
try {
String string = "exception";
generator.executeAction(string);
} finally {
generator.close();
}
}
主要我处理了异常:
try {
manager.execute();
} catch (MyException e) {
System.err.println(e.toString());
}
}
主要是我能抓住它。这是正常行为吗?
是的,这是正确的行为。 try-with-resources 语句抛出抑制异常,这不是你的情况。看看What is a suppressed exception?
当您的 Generator.close() 方法抛出另一个异常时,您将得到一个被抑制的异常 - 在 finally 块中 -:
public void close() {
throw new OtherException("some msg");//This Exception will be added to your main Exception (MyException) as a Suppressed Exception
System.out.println("Closed");
}
所以是的,这是正常行为。
是的,这是正常行为。至少它确保生成器已关闭,但如果 finally 抛出异常,则可能会抑制 try 块中的异常。
使用 java7 你应该使用 try-with-resources.
有 Generator
实现 AutoCloseable
,它会强制执行你已经拥有的 .close()
方法,因此除了实现之外没有真正的改变。
更改执行方法以使用 try-with-resources
至
try(Generator generator = new Generator()) {
String string = "exception";
generator.executeAction(string);
}
好处是,除了更少的代码之外,@Mouad 提到的抑制异常得到了正确处理。 .close()
调用的异常可从 e.getSuppressedException()
获得
我正在使用 class 生成器的这种方法:
public void executeAction(String s) throws MyException {
if (s.equals("exception"))
throw new MyException("Error, exception", this.getClass().getName());
}
public void close() {
System.out.println("Closed");
}
我在这段代码中使用了它们:
public void execute() throws MyException
Generator generator = new Generator();
try {
String string = "exception";
generator.executeAction(string);
} finally {
generator.close();
}
}
主要我处理了异常:
try {
manager.execute();
} catch (MyException e) {
System.err.println(e.toString());
}
}
主要是我能抓住它。这是正常行为吗?
是的,这是正确的行为。 try-with-resources 语句抛出抑制异常,这不是你的情况。看看What is a suppressed exception?
当您的 Generator.close() 方法抛出另一个异常时,您将得到一个被抑制的异常 - 在 finally 块中 -:
public void close() {
throw new OtherException("some msg");//This Exception will be added to your main Exception (MyException) as a Suppressed Exception
System.out.println("Closed");
}
所以是的,这是正常行为。
是的,这是正常行为。至少它确保生成器已关闭,但如果 finally 抛出异常,则可能会抑制 try 块中的异常。
使用 java7 你应该使用 try-with-resources.
有
Generator
实现AutoCloseable
,它会强制执行你已经拥有的.close()
方法,因此除了实现之外没有真正的改变。更改执行方法以使用 try-with-resources
至
try(Generator generator = new Generator()) {
String string = "exception";
generator.executeAction(string);
}
好处是,除了更少的代码之外,@Mouad 提到的抑制异常得到了正确处理。 .close()
调用的异常可从 e.getSuppressedException()