2014-09-09 9 views
3

한다고 가정 우리는 방법에 따라 한 (아주 단순화 된 버전)를 잃었다. 기본적으로 블럭이 예외를 던지면 어떤 예외가 try 블록에 던져 졌는지 알 수있는 방법이 있습니까? doSomething() 메서드를 수정할 수 없다고 가정 해보십시오.자바 예외

답변

6

Section 14.20.2 of the JLS 상태 :

try 블록의 실행이 때문에 값 V의 던져 갑자기 완료되면

, ...

...

경우] finally 블록은 이유 S로 인해 갑자기 완료되고 try 문은 이유 S에 대해 갑자기 완료됩니다 (값 V의 throw는 무시되고 잊어 버립니다).

자바는 원래 예외 V을 버려야합니다 ("갑자기 완료") 전체 시도가-finally 블록 S에 "갑작스럽게"합니다 (finallyException, "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 절에서 예외를 던지지 않도록 열심히 노력하십시오.