2009-09-23 7 views
14

내 MVC 프로젝트에서 Application_Error를 사용하고 싶지만 제대로 작동하지 않습니다. 나는 내에서 Global.asax 파일에 다음을 추가합니다. (세션이 테스트를 위해 아니라 내가이 일을 얻는 경우 임 거, 오류를 기록하는 데이터베이스를 사용합니다.)ASP.NET MVC에서 Application_Error를 어떻게 사용합니까?

protected void Application_Error(object sender, EventArgs e) 
    { 
     Exception objErr = Server.GetLastError().GetBaseException(); 
     Session["Test"] = "Message:" + objErr.Message.ToString(); 
    } 

그런 다음 내가 던져하려고 내 HomeController 및 Home/Index View에서 예외가 발생하지만 Debug 만 트리거합니다. 내 Webconfig 파일에서

public ActionResult Index() 
    { 
     ViewData["Message"] = "Welcome to ASP.NET MVC!"; 
     throw (new Exception()); 
     return View(); 
    } 

내가는 defaulterror 페이지를 설정하지만보기로 리디렉션되지 않습니다

<customErrors defaultRedirect="Home/Error"> 
     <error statusCode="403" redirect="NoAccess.htm" /> 
     <error statusCode="404" redirect="FileNotFound.htm" /> 
    </customErrors> 

답변

14

먼저 글로벌 오류 처리가 최후의 수단이어야하며 컨트롤러 클래스에는 오류에 대한 특정 오류 방법이 있다는 것을 기억하십시오.

protected virtual bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception) 

표준 공유 오류보기로 리디렉션 할 수 있습니다.

protected override bool OnError(string actionName, 
    System.Reflection.MethodInfo methodInfo, Exception exception) 
{ 
    RenderView("Error", exception); 
    return false; 
} 

전역 응용 프로그램 오류에이 문제는 뷰 또는 컨트롤러의 개념이 없다는 것입니다, 그래서 당신이 거기에 리디렉션 할 경우 당신은 알려진 URL을 사용해야합니다

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    System.Diagnostics.Debug.WriteLine(exception); 
    Response.Redirect("/Home/Error"); 
} 

그러나이 작업을 수행 할 필요는 없습니다. 웹에 기본 오류 페이지를 설정 한 경우설정 후 당신은 홈 컨트롤러

public ActionResult Error() 
{ 
    return View(); 
} 
에 다음 존재하지 않는 홈 컨트롤러에 오류보기를 추가하지 않는 한 그, 그러나

<customErrors defaultRedirect="Home/Error" /> 

리디렉션이 필요하므로 추가하지 마십시오

그런 다음 (현명한 경우) 오류 처리 코드를 Error() 메서드에 넣습니다. 처리되지 않은 모든 오류가 종료되는 곳이기 때문입니다.

public ActionResult Error() 
{ 
    Exception exception = Server.GetLastError(); 
    System.Diagnostics.Debug.WriteLine(exception); 
    return View(); 
} 

마지막으로 로컬 호스트에 연결하는 경우 기본적으로 사용자 정의 오류가 표시되지 않습니다. 따라서 해당 동작을 변경해야합니다.

<customErrors mode="On" defaultRedirect="/Home/Error" /> 
+1

솔루션에 문제가 있습니다. CustomErrors는 컨트롤러를 트리거하지 않고 홈/오류보기로 직접 리디렉션합니다. 이게 가능한지 몰랐는데, 디버그 포인트를 Error Action 메서드에 넣으면 디버그는 절대 호출되지 않습니다. 오류보기는 화면에 표시되지만 URL은 여전히 ​​오류를 유발 한 URL과 동일합니다. 예를 들어/Home/Job에서 오류가 발생하면 오류보기가 표시되지만 URL은/Home/Job 인 경우 – Poku

+18

안녕하세요 @blowdart : 의견을 남길 수없는 새로운 사용자의 메시지 :이 답변은 평면입니다. 잘못된. 문제는 web.config를 사용하여 기본 컨트롤러 작업으로 리디렉션하는 경우 Controller 클래스에서 Server.GetLastError()를 호출하면 작동하지 않는다는 것입니다. ASP는 서버 변수를 지우고 예외 정보를 잃어 버리는 오류 컨트롤러에 대한 새 HTTP 요청을 시작합니다. –

+3

악성 응답 ..... 여기에 왜 두 가지를 모두 사용해야하는지에 대한 좋은 기사입니다. http://www.prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc –

1
  • 당신이 세션가 처음에 설정해야합니까? IRequiresSessionState으로 표시되지 않은 IHttpHandler에서 오류가 발생하면 Session에 액세스하는 데 실패합니다.
  • Session["Test"]로 무엇을하고 있습니까? 코드가 실제로 작동하지 않는다고 확신합니까? File.Open을 시도하여 일부 텍스트 (예 : 현재 시간)를 C:\my-log.txt으로 출력 할 수 있습니다. 이는 Session을 사용하는 것보다 약간 더 성공할 가능성이 큽니다.
  • GetBaseException은 내가 말할 수있는 한이 경우 유용하지 않으며 (일반적으로 로깅 용으로도 유용하지 않습니다.)
  • Messagestring입니다. .ToString()을 호출 할 필요가 없습니다. 일반적으로 을 피하는 것이 좋습니다 (가능하면ToString()). 개체의 유형을 알 수 없기 때문에 사용하는 경우 빨간색 깃발이어야합니다. 유형 시스템을 끝내면 미묘한 버그 (예 : DBNull.Value.ToString() == "")를 숨길 수 있습니다. GUI의 경우 기본 제공 유형은 문화적으로 민감하며 이식성 문제를 피하기 위해 .ToString(IFormatProvider) 오버로드를 제공합니다. 또한 과부하가 object에도 없기 때문에 매우 약한 형식의 .ToString 호출을 피할 수있는 보호 수단이기도합니다.
관련 문제