2017-04-17 14 views
5

나는이 두 주제에 대해 매우 불확실하다. 같은 방법으로 처리해야하는 예외에 대해서는 다중 catch를 사용해야한다는 것을 알고 있습니다. 그러나 어떤 목적을 위해 나는 정말로 그런 것을 필요로합니다.멀티 캐치 (multi-catch)를 언제 사용하고 언제 rethrow를 사용할 수 있습니까?

private void something(String name) throws IOException, RemoteException { 
    try { 
     ... 
    } catch (Exception ex) { 

     ... // do something 

     throw ex; 
    } 
} 
+1

일반적인 예외를 사용하는 것은 나쁜 습관입니다. [here] (http://stackoverflow.com/questions/2416316/why-is-the-catchexception-almost-always-a-bad-idea)를 참조하십시오. – Enzokie

+0

이 질문이 명확하지 않고 의견을 기반으로하지 않습니까? –

답변

3
당신은 그것의 실행 중에 발생 예외가 같은 방식으로 처리되어야한다이 방법에 대한 고려와 클라이언트

에 예외를 전파시키는 전에 작업을 수행하려는 경우 당신은 그것을 할 수

예를 들어 정보 로깅과 같이 예외가 발생하면 특정 처리를 수행하려고한다고 가정합니다. 그래서 당신은이 작업을하기 위해 그것을 잡습니다.
그러나 catch 된 예외가 문제이며 로깅이 예외의 "실제"처리가 아니라고 간주합니다. 그래서, 당신은 그것을 다시 던져서 전파시킵니다.

+0

좋습니다, 감사합니다. 하지만 한 가지 더 물어볼 수 있습니까? 캐치에 의해 NullPointerException이 던져지고 계산됩니다. throws 절에서 IO 및 RemoteException 만 언급 되었기 때문에이 예외가 호출하는 메소드에도 던져 질 수 있습니까? 안녕하십니까? – LaBlum

+0

안녕하십니까. 매우 흥미로운 질문입니다. 'NullPointerException'은'RuntimeException'입니다. 이러한 종류의 예외는 메소드 선언에서 명시 적으로 선언 할 필요가 없습니다. 잡기 또는 던지기와 같은 방법으로 선언하지 않고 던질 수 있습니다. 예외를 검사하는'IOException'과'RemoteException'과는 반대입니다. 이 마지막 부분은'Exception'에서만 파생되며'RuntimeException'에서는 파생되지 않습니다. – davidxxx

+0

그건 사실입니다 ... 나는 그것을 고려하지 않았습니다. IllegalArgumentException이 던져지면 어떻게됩니까? 예를 들어 int 형 변수에 String을 저장하려고했기 때문에 어떻게됩니까? throws 절에 언급되어 있지 않지만 어쨌든 호출하는 메서드에 던져 질까요? – LaBlum

3

당신이 예외에 대한 호출 방법을 통지 할 때마다 다시 발생, 당신은 잡아 다시 throw 예외입니다.

callSomething() 메서드가 something()을 호출하는 경우가 있습니다. something() 내부에서 예외가 발생하면 예외를 catch하므로 응용 프로그램이 실패하지 않고 callSomething() 메서드로 다시 throw됩니다. 그런 다음 callSomething()은 내부 오류에 대해 클라이언트에 알립니다.

다른 예는 MVC 패턴에서 클라이언트가 제출 한 요청은 요청 매핑을 기반으로하는 컨트롤러의 일부 방법으로 제공됩니다. 컨트롤러가 서비스를 호출하고 서비스가 DAO의 일부 메소드와 상호 작용합니다. DAO에서 몇 가지 예외가 발생하면 DAO는 서비스 예외를 다시 발생시키고 서비스는 컨트롤러에 다시 전달되며 오류 메시지에 대해 클라이언트에 알리는 컨트롤러입니다. 이것은 예외 전파을 java로합니다. 예외가 호출 스택을 통해 메서드에서 메서드로 전파되어이 잡힐 때까지 예외가 발생합니다.

멀티 캐치

당신이 예외의 여러 유형에 대해 동일한 작업을 수행 할 경우, 당신은 멀티 캐치를 사용합니다.

2

당신은 예외가 방법을두고시키기 전에 전처리 뭔가 원하는

  1. 다음과 같은 상황에서 다시 throw 필요합니다. 그러나 예외의 유형에 대해 신경 쓰지 않는다면 finally 블록에서도 사전 처리를 수행 할 수 있습니다.
  2. 확인 된 예외를 검사되지 않은 예외로 변환하려고합니다. 이 경우 모든 예외를 catch(Exception ex)으로 잡아서 throw new RuntimeException(ex)으로 재실행 할 것입니다.
  3. 사용자 정의 예외가 빌드 된 예외 대신 throw되도록합니다. 그래서 모든 예외를 잡아서 바람직하지 않은 예외 객체를 생성하고 그 예외를 던지십시오. 많은 API가이를 수행합니다. 예를 들어, Spring은 직관적이지 않은 JDBC 예외를 Spring 사용자 정의 예외로 변환합니다.
  4. 이것은 전처리와 비슷합니다. ArrayList 또는 뭔가를 생성하여 모든 예외를 추적하므로 여러 단계가있는 프로그램의 끝에 어떤 단계에서 예외가 발생하는지 알 수 있습니다. 나는 이것을 Talend에서 생성 된 자바 코드에서 사용하는 것을 보았다.