2012-01-04 4 views
4

내 응용 프로그램의 하위 레이어에서 예외를 처리하려고합니다 (처리 할 수 ​​있기 때문에). 그러나 매개 변수가 NULL이고 그럴 경우 ArgumentNullException을 throw하지 않아야하는 것처럼 응용 프로그램을 중단해야하는 오류가 있습니다.컨트롤러에서 try ... catch를 사용하지 않으려면 어떻게해야합니까?

서비스 계층을 호출하는 컨트롤러 계층을 고려한 경우 나는 그들이 여기 (로깅)를 모두 처리하기를 원하기 때문에 서비스 레이어가 예외를 던지지 않도록하고 싶다.하지만 이런 경우 엔 NULL 케이스와 같이 불가능하다.

컨트롤러에서 try ... catch를 사용하지 않는 가장 좋은 방법은 무엇입니까? 또는 나는 정말로 컨트롤러를 잡으려고 노력해야합니까?

답변

7

Application_Error 메서드에서 처리되지 않은 모든 예외 (처리되지 않는 예외)를 처리하는 것을 선호합니다. 그것은 당신이 예외를 기록 할 수있는 곳이며 그 본성에 기반하여 적절한 오류보기를 보여줍니다.

사용자 정의 모델 바인더, 유효성 검사기, 작업 필터 등과 같은 것들은 예외적 인 조건을 가로 채어 어디에서나 try/catch로 컨트롤러를 오염시키지 않아도됩니다.

업무상의 오류와 같이 처리 할 수있는 모든 것 ... try/catch를 사용하거나 if 문을 사용하는 것이 좋으며 서비스 작업 영역에 어떤 작업이 성공했는지 실패했는지 알릴 수 있습니다 (TryXXX). 패턴).

항상 그렇듯이 질문에 대한 대답은 달라집니다. 응용 프로그램 구성 방법, 서비스 계층 구성 방법, 일어날 수있는 오류의 가능성, 명시 적으로 처리하려는 오류의 내용 ... 많은 요소, 많은 요소, 많은 요소 및 물론 많은 요소, 많은 요소, 가능한 많은 솔루션.

3

사용자 정의 모델 바인더, 검증, 액션 필터, ... 등의

것 또한 모든 곳에서 시도/캐치와 컨트롤러를 오염 을 방지하기 위해 몇 가지 예외 조건을 차단하기위한 허용 할 수 대린 디미트로프의 대답에 협력하기 .

이것이 내가 선호하는 것입니다.

public class ExceptionLoggingFilter : IExceptionFilter 
{ 
    private ILogger _logger; 

    public ExceptionLoggingFilter(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void OnException(ExceptionContext context) 
    { 
     Exception ex = context.Exception; 

     if (_logger != null) 
     { 
      _logger.log(ex) 
     } 
    } 
    context.ExceptionHandled = true; //see note 
} 

참고 : 당신은 당신이를 추가 할 수있는 예외를 다시 발생하지 않으려면 다음과 같이 것 IExceptionFilter 할 수 있습니다. 로그 만 기록하고 전달할 다른 필터가있는 경우 해당 행을 제거 할 수 있습니다.

은 다음 Global.aspx에 당신이 할 것 :

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new ExceptionLoggingFilter(new Log4NetLogger())); 
} 

나를 위해 그것을 쉽게 다른 기능을 분리 할 수 ​​있기 때문에 내가하는 Application_Error를 만드는 필터를 만드는 선호한다. (예 : 로깅, 응용 프로그램에서 처리 할 수 ​​있는지 확인하는 등)

관련 문제