8

전역 예외 필터를 사용하여 모든 예외를 처리하고 기록합니다. 그것은 OnException 메소드를 오버라이드 (override) -ExceptionContext.ExceptionHandled가 true로 변경됩니다. 예외 처리는 어디에서 처리됩니까?

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new ElmahHandleErrorAttribute()); 
     filters.Add(new HandleErrorAttribute()); 
    } 

이 글로벌 액션 필터 ElmahHandleErrorAttribute가 정의하는 방법입니다. OnException 방법이 실행될 때 context.ExceptionHandled의 값이 true 이유

public class ElmahHandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext context) 
    { 
     //Is the exception handled already? context.ExceptionHandled seems to be true here 
     if (!context.IsChildAction && (context.HttpContext.IsCustomErrorEnabled)) 
     { 
      //Do other stuff stuff 
      //Log to Elmah    
     } 
    } 
    ... 
} 

는 이해가 안 돼요. 이 예외는 어떻게 처리됩니까?

-EDIT-

은 내가 Web.ConfigcustomErrors 섹션이 있습니다. ErrorController 클래스가 있고 GeneralHttp404이라는 작업이 있습니다. ElmahHandleErrorAttribute 시작의 OnException 방법은 실행시,하지만 ExceptionContext.ExceptionHandled의 값이 true로 설정되어 내가 (중단 점 적중되지 않습니다), 컨트롤러 액션 General가 실행되지 않습니다 이해하지

<customErrors mode ="On" defaultRedirect="Error/General"> 
     <error statusCode="404" redirect="Error/Http404"/> 
    </customErrors> 

.

+0

코드에서'context.ExceptionHandled'를 볼 수 없습니다. 어디에 있습니까? – gdoron

+0

@gdoron context.ExceptionHandled에 대한 검사를 제거했습니다.'if (! context.IsChildAction &&! context.ExceptionHandled && (context.HttpContext.IsCustomErrorEnabled))' – escist

+0

컨트롤러의'OnException' 메소드를 오버라이드 했습니까? – gdoron

답변

19

예외가 발생하면 전역 필터의 순서는 in reverse order을 실행합니다. 이는 HandleErrorAttribute이 먼저 실행됨을 의미합니다.

당신은 HandleErrorAttributehere의 코드를 볼 수 있지만, 짧은에, 그것은 : ExceptionHandled이 거짓 및 사용자 지정 오류가 활성화 된 경우

  1. 만 실행합니다.
  2. 오류보기로의 리디렉션을 설정합니다. 기본값은 Error입니다.
  3. ExceptionHandled을 true로 설정하십시오.

는 제 1 필터가있어 같이 그것이 오류로 뷰를 설정하는 원인 true로 설정 ExceptionHandled, 실행될 때, 다음 ExceptionHandled 거짓이다. 따라서 자신의 필터가 실행될 때 ExceptionHandled이 이미 true로 설정되어있는 것입니다. 맞춤 오류가 사용 중지 된 경우 HandleErrorAttribute은 처리하지 않았으므로 ExceptionHandled은 여전히 ​​거짓입니다. 이 경우, ELMAH는 처리되지 않은 (죽음의 노란색 화면) 오류이므로 어쨌든 오류를 기록하므로 클래스의 테스트는 오류의 중복 기록을 방지하는 것입니다. General 동작이 실행되지 유장에 대한 다른 질문에 필터가 어떤 명시 적 자신을 재 설정하지 않으면

지금의 defaultRedirect에만 사용되기 때문에 예외가 ActionMethod 및 내부 발생하면 실제로는 무시됩니다 글로벌 필터 HandleErrorAttribute이 등록되어 있습니다. 그러나 존재하지 않는 URL (ActionMethod 내에서 발생하지 않는 오류)을 입력하면 호출됩니다. 또한 HandleErrorAttribute을 Global.asax.cs에 등록 할 행을 주석 처리하면 컨트롤러 실행이 항상 General이됩니다.

+0

설명해 주셔서 감사합니다. 정말 도움이되었습니다. ElmahHandleErrorAttribute를 실행하는 첫 번째 필터로 지정합니다. 이 맞춤 필터의 순서를 설정하면이 문제를 해결할 수 있습니까? 이 코멘트 (http://stackoverflow.com/a/9163926/1242061)에 따라 먼저 실행하려는 필터에 더 높은 Order 값을 제공해야합니다. – escist

+1

예, Order 속성을 사용하여 재생할 수 있다고 생각합니다 (그러나 전역 필터에서이를 수행하는 방법을 모르지만 속성으로 사용할 때만 수행 한 것임). RegisterGlobalFilters에서 필터를 추가하는 순서 만 바꾸면됩니다. 오류가 발생하면 마지막에 추가 한 항목이 먼저 실행됩니다. 왜 ELMAH가 먼저 실행되기를 원하는지 확실하지 않습니다. 실제로 수행하면 ExceptionHandled를 확인할 수 없습니다. 그 경우에는 항상 false가 될 것이기 때문입니다. –

+0

필터를 등록 할 때 주문을 지정했습니다. 이제 내 사용자 정의 필터'ElmahHandleErrorAttribute'가 먼저 오류를 처리하고 있습니다. 귀하의 질문에 관해서는 왜 ELMAH가 먼저 실행되기를 원하는지 확신 할 수 없습니다. 당신은 이것이 나쁜 생각이라고 생각합니까? 사용자 지정 오류 페이지를 표시하고 오류 유형을 확인하고 특정보기를 표시하기 때문에이 작업을 수행하고 있습니다. – escist