한다고 가정 우리는 방법에 따라 한 (아주 단순화 된 버전)를 잃었다. 기본적으로 블럭이 예외를 던지면 어떤 예외가 try 블록에 던져 졌는지 알 수있는 방법이 있습니까? doSomething() 메서드를 수정할 수 없다고 가정 해보십시오.자바 예외
Q
자바 예외
3
A
답변
6
Section 14.20.2 of the JLS 상태 :
try 블록의 실행이 때문에 값 V의 던져 갑자기 완료되면, ...
...
경우] finally 블록은 이유 S로 인해 갑자기 완료되고 try 문은 이유 S에 대해 갑자기 완료됩니다 (값 V의 throw는 무시되고 잊어 버립니다).
자바는 원래 예외 V
을 버려야합니다 ("갑자기 완료") 전체 시도가-finally 블록 S
에 "갑작스럽게"합니다 (finally
Exception
, "B").
원래 try
블록 예외 "A"를 검색 할 수있는 방법이 없습니다.이 예외는 JLS에서 V
에 해당합니다.
0
finally 블록은 try-catch 블록에서 반환 값이나 예외를 사용합니다.
기본적으로 finally 절은 자원의 적절한 릴리스를 보장합니다. 그러나 finally 블록 내에서 예외가 발생하면 try-catch 블록에서 반환 값이나 예외를 사용합니다.
0
수동으로 할 수 있지만 약간의 PITA입니다.
public class ExceptionException
{
public static void main(String[] args)
throws Exception
{
Exception saved = null;
try {
throw new Exception("A");
} catch(Exception ex) {
saved = ex;
} finally {
try {
throw new Exception("B");
} catch(Exception ex) {
if(saved != null)
ex.addSuppressed(saved);
}
}
}
}
rgettman이 말했듯이 JLS는 finally 절에서 예외가 발생하면 일반적으로 다른 예외를 잊어 버리게됩니다. 도덕 : finally 절에서 예외를 던지지 않도록 열심히 노력하십시오.