2013-02-07 2 views
0

예외 처리기와 관련하여 질문이 있습니다. 다른 용도로 많은 패키지와 클래스가있는 프로젝트의 구조화 된 코드가 있습니다. 이 코드에는 다양한 유형의 예외를 잡으려고 시도하는 곳이 많이 있습니다. 그들 중 일부를 언급하려면 SAXException, IOException, NumberFormatException, ParserConfigurationException, RuntimeException 등이 있습니다.Java 글로벌 예외 처리기

예외를 잡는 모든 경우에 스택 추적 만 인쇄합니다. 내가 예외를 우연히 만나는 순간, 나는 스택 추적에서 그것이 발생한 곳의 기능을 알아 내고 그에 따라 수정한다. 코드 크기가 크지 않고 디버깅하기가 쉽지 않기 때문에 예외를 제외하고는 아무 것도하지 않습니다.

이제 제 3 자 개발자가 제공하는 외부 Java 라이브러리를 사용하고 있습니다. 이 라이브러리는 내가 호출 할 수있는 모든 가능한 함수에 대해 예외를 throw합니다. 나는이 라이브러리를 활용하기 위해이 라이브러리에 래퍼를 작성하려고합니다. 그러나, 나는이 라이브러리로 인해 내 코드에서 try/catch 블록을 도처에 발견한다. 예를 들어

내 코드는 다음과 같습니다 -

this discussion에서 언급 한 바와 같이이 경우, 나는 글로벌 예외 핸들러로 전환해야 주어진
Class Wrapper 
{ 
    public void method1() 
    { 
     .... 
     try 
     { 
      ... 
      third party library calls... 
      ... 
     } catch (Exception e) { e.printStackTrace(); } 

    } 

    public void method2() 
    { 
     .... 
     try 
     { 
      ... 
      third party library calls... 
      ... 
     } catch (Exception e) { e.printStackTrace(); } 

    } 
    // ... and so on... there are 50-100 methods like this. 
    // some are even one-liners. 
} 

?

내 코드에서 어디에서나 try/catch 블록을 작성하지 않아도됩니까?

또한 기존의 try/catch 블록을 제거해야합니까?

감사합니다.

+0

사용 포켓몬 오류 처리기를 검사 예외를 처리하도록 클라이언트를 강제로하지 않습니다 - 그들 모두를 잡아! 모든 코드를 하나의 try/catch합니다. –

+3

체크 예외를 처리해야합니다.스택 추적을 인쇄하여 예외를 삼키는 것은 패턴이 아닙니다. 실제로 처리해야하거나 처리 할 상위 수준의 클래스에 다시 throw해야합니다. – Perception

답변

1

클라이언트 코드에서 확인 된 예외를 처리하지 않으려면 래퍼에서 다음과 같이 할 수 있습니다.

public void method1() { 
    try { 
     //3rd party code here.... 
    } 
    catch(RuntimeException e){ 
     throw e; 
    } 
    catch(Exception e){ 
     throw new RuntimeException(e.getMessage(),e); 
    } 
} 

공지 사항이 제 3 자 라이브러리에 의해 던져진 예외를 삼키는 방지하고, IOException 같은 SQLException

+0

고마워. 그러나 내 문제는 내가 구현하는이 제 3 자 라이브러리를 통해 래퍼있는 200 메서드를 말할 수 있습니다. 각 메소드는 try/catch 블록을 가지고 있습니다. 나는 그것을 피할 수있는 방법이 있다면 그것을 알고 싶다. – Raj

+0

@Raj는 단일 클래스의 일부입니까? 'Reflection'을 사용하여 그것들을 호출 할 수 있습니다. Eclipse와 같은 일부 IDE는 메소드 위임을위한 자동화 된 코드 생성을 제공합니다. 당신도 그것을 사용할 수 있습니다. –

1

예외가 발생해도 프로그램이 종료되지 않는다면 전역 예외 처리기를 사용할 수 있습니다. 당신은 throws Exception (또는 좀 더 구체적인 예외 클래스)을 여러 장소에 놓아야 할 수도 있습니다 (처리되지 않은 예외 컴파일 타임 오류를 방지하기 위해). 이것은 이상과는 거리가 멀습니다. 예외가 던져지는 곳).

반면에 프로덕션 수준 코드에서 일반적으로 필요한 오류에서 프로그램을 복구하려면 try-catch 문을 적절하게 배치해야합니다 (try-catch 문이 포함될 수 있음). 귀하의 코드에서 도처에).

예를 들어, IOException이 발생하면 다시 시도하거나 NumberFormatException이 발생하면 입력이 유효하지 않다는 것을 사용자에게 알리고 다시 시도하도록 할 수 있습니다.

try-catch 문을 제거하면 안됩니다.이 동작이 원하는 동작인지, 그리고 대체 솔루션 (예 : 글로벌 try-catch 문)으로 재생할 수 있는지 여부를 사용자가 무엇을하는지 확인해야합니다.

+0

예외가 발생할 때마다 더 이상 진행할 수없는 경우가 있습니까? 필자는 XML을 통한 입력과 파일 형식의 출력을 가진 컴파일 및 시뮬레이션 도구를 작성합니다. 사용자와 아무런 상호 작용이 없습니다. 따라서 입력 파일에 오류가 있으면 컴파일을 더 이상 진행할 수 없습니다. – Raj

+1

@Raj 그런 다음 함수에'throws' 문을 넣거나 최소한의 예외를 잡아야한다. (처리되지 않은 예외의 컴파일 타임 오류가 발생하는 경우). 너의 대답에 대해 – Dukeling