2013-05-28 3 views
-1

다음 코드에서는 [FatalException 및 MyException] 예외가 발생합니다. 간단한 myexception (덮어 쓴?) FatalException을 잃어 버리게 만듭니다. 방법?Java에서 손실 된 예외를 처리하는 방법

이 상황을 어떻게 처리합니까?

try{ 
     try { 
     throw new FatalException("Important"); 
     } 
    finally 
    {    
      throw new MyException("trivial"); 
    } 
    }catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

내부 try 블록에 대한 catch 클래스가 없습니다.

(기사에서 자바의 결함 예외를 언급 했음)이를 극복하기 위해 어딘가에 있어야합니까? 어쩌면 최근 표준이 그것을 바꿨을까요?

+2

관련 항목 : http://stackoverflow.com/q/4711064/335858 – dasblinkenlight

+5

처리 방법은 다음과 같습니다. 이렇게 코드를 작성하지 마십시오. –

+0

@Matt Ball : 내 코드가 아니므로, 이것에 관해 읽었습니다! – Dineshkumar

답변

0

이것은 실행 순서 때문입니다. 모든 의도와 목적에 대한 초기 throw는 방법 (읽기 : 출구 지점)에 대한 사실상의 return 문이지만,이 을 보장하는 finally 블록 내부의 코드는 finally 블록으로 try 블록 내부에 있기 때문에 방법 전에 실행해야 (with a few exceptions)을 반환합니다. 따라서 메소드들 앞에 return/throw 다른 예외가 발생합니다. 이것은 더 새롭고 빠른 메소드 리턴입니다.

이 상황을 처리하는 방법으로는 절대로 들어갈 수 없습니다. 이것이 자바가 어떻게 행동하고이 코너에서 스스로 프로그래밍하는 것을 피하는 것임을 알아야합니다.

+0

그것이 실행된다는 보장은 아닙니다. 마지막으로 실행되기 전에 내가 전원 소스를 당기면 어떨까요? – Woot4Moo

+0

@ Woot4Moo 전원을 당기면 메서드 반환도 발생하지 않습니다. –

+0

맞으므로 진술이 정확하지 않습니다. – Woot4Moo

0

이것이 예외를 중첩 할 수있는 올바른 구조 일 수 있습니다.

try 
{ 
    // Some codes to be tried over here. 
} 
catch(FatalException fe) 
{ 
    System.out.println("Fatal Exception occurred."); 
} 
catch(Exception e) 
{ 
    System.out.println("Error! "); 
} 
catch(MyException me){} 

이렇게하면 예외가 잡힐 수 있습니다.

+0

순서가 중요하므로 MyException은 Throwable을 확장하지 않는 한 결코 적중되지 않습니다. – Woot4Moo

+0

catch (Exception)는 모든 예외를 캐치하고 더 이상 catch가 실행되지 않습니다. – Dineshkumar

2

우아하게 처리 할 방법이 없습니다. finally은 자바로 컨트롤을 이어 받아 원하는대로 할 수 있습니다. even return normally from a try block that threw an exception. 당신은 내부 예외를 처리해야하는 경우

, 당신은 잠재적으로 깨지기 쉬운 코드를 많이 작성해야합니다 :

Exception important = null; 
try{ 
    try { 
     important = new FatalException("Important"); 
    } finally { 
     if (important != null) throw important; 
     throw new MyException("trivial"); 
    } 
} catch (Exception ex) { 
    ex.printStackTrace(); 
} 

가장 좋은 해결책은 같은 코드를 작성하지 않는 것입니다.

+0

맞습니다. 그는 이것을 처리하기 위해 잠재적으로 약한 코드가 필요합니다. –

관련 문제