2013-01-11 4 views
2

프레임 워크 Spring 3을 사용하여 웹 응용 프로그램을 작성했습니다. 컨트롤러가 N 개인 경우를 생각해보십시오. 각 컨트롤러는 노출 된 서비스에 요청을 위임하고 응답을 얻고 사용자에게 반환합니다.예기치 않은 예외를 잡는 것이 좋습니다.

예기치 않은 런타임 예외를 컨트롤러 코드 밖으로 던지는 것이 더 나은지 알고 싶습니다. 나는 각 컨트롤러 메소드에 대해 다음과 같은 것을 쓰고 싶지 않다. 아니면 유일한 방법입니까?

try { 
    //call the service 
} catch(ServiceException serviceEx) { 
    //do process for know exception 
} catch(Exception ex) { 
    //return generic error message. 
} 

스프링 예외 해석기를 사용할 수 있다는 것을 알고 있습니다. 하지만 예기치 않은 오류가 발생하면 다른 오류 페이지를 표시하고 싶지 않습니다. 내 위젯의 일부로 UI에 몇 가지 일반적인 오류 메시지를 표시하고 싶습니다.

편집 : 나는 또한 몇 가지 작업을 수행 할 때 내 사용자가 예외 스택 트레이스를보고 싶지 않아

.

다르는

+0

예외는 '예상'입니까? –

+0

@Amir : "예상"예외는 특별히 잡는 예외입니다. 여러분은 그것을 기대합니다. 그래서 여러분은 그것을위한'catch' 절을 작성했습니다. 예기치 않은 스택은 스택 추적으로 인해 UI에 거품을 일으키지 않는 오류 메시지입니다. – Gabe

답변

1

당신은이 방법을 사용하여 런타임에 예기치 않은 예외를 잡을 수 있습니다.

try { 
    ... 
    } catch (Exception e) { 
    throw new RuntimeException("msg",e); 
    } 
3

잡는 것 RuntimeException 님은 나쁜 습관이라고 생각합니다. 원래 RuntimeException 초는 프로그래밍 오류의 원인으로 생각됩니다 (예 : null 수표가 누락되었음을 나타내는 NullPointerException). 프로그램에서 복구 할 수있는 오류 (예 : FileNotFoundException)를 나타내는 예외를 확인하는 반면.

오늘날 문제는 확인 된 예외를 사용해야하는 많은 프레임 워크에서 RuntimeException을 사용한다는 것이 문제입니다. 따라서 프로그램이 예외를 처리 할 수있는 경우와 프로그래밍 오류 (버그)가 발생한 경우를 구별하기가 어렵습니다.

이것은 엔터프라이즈 개발을위한 나의 개인적인 견해입니다. 대부분의 사람들은 확인 된 예외를 삭제하고 모든 것을 스칼라에서와 같이 검사되지 않은 예외로 처리해야한다는 것을 알고 있습니다.

2

제 생각에는 복구 할 수있는 코드에서만 예외를 catch해야합니다. 다른 모든 예외 (선택 또는 선택 취소)는 예외를 기록하고 사용자에게 일부 예외를 찾기 위해 사용할 수있는 ID가있는 일반 오류 페이지를 표시하는 예외 핸들러에 의해 캐치되어야합니다. 예를 들어

, struts2에서 당신 것이과 같이 : 나는 스프링 MVC를 사용하지 않습니다하지만이 문서는 당신에게 동네 짱 exceptionhandler에 대한 옵션을 제공하는 것

<global-exception-mappings> 
    <exception-mapping exception="java.lang.Exception" result="unrecoverableException"/> 
</global-exception-mappings> 

:

http://doanduyhai.wordpress.com/2012/05/06/spring-mvc-part-v-exception-handling/

0

RuntimeException은 계약 위반 또는 복구 할 수없는 오류와 같은 상황을 위해 설계된 것 같습니다. 대부분의 경우, 컨테이너 또는 일부 외부 인프라로 처리해야합니다. 또는 이들을 처리하기 위해 많은 중복 코드를 작성해야하며 이는 Spring의 디자인 철학에 위배됩니다.

실제로 일부 다른 일반 메시지로 전송해야하는 경우 이러한 예기치 않은 RuntimeException을 잡기 위해 일부 필터 또는 인터셉터를 사용할 수 있습니다.

관련 문제