ASP.NET의 새 기능

ASP.NET은 오류를 처리하고 응답하는 방법에서 여러 가지 고급 기능을 제공합니다. 기존 ASP에서는 "On Error Resume Next"(또는 JScript의 try-catch 블록)로 오류를 처리합니다. 또는 Microsoft Internet Information Services(IIS) 5.0을 실행하는 경우 ASPError 개체를 사용하여 사용자 지정 오류 보고 페이지를 만듭니다. 그러나 이러한 방법에는 제한이 있습니다.

ASP.NET은 ASP.NET 응용 프로그램을 실행할 때 발생할 수 있는 오류를 처리하고 응답하는 방법을 여러 수준으로 제공합니다. ASP.NET은 오류가 발생할 때 오류를 잡고 응답할 수 있는 세 가지 기본 메서드인 Page_Error 이벤트, Application_Error 이벤트 및 응용 프로그램 구성 파일(Web.config)을 제공합니다.

이 문서에서는 ASP.NET 응용 프로그램의 새 기능을 사용하는 방법을 보여 줍니다. 이 문서에서는 ASP.NET과 직접 관련이 있는 사용자 지정 오류 페이지와 일반 오류 보고를 제공하는 방법을 설명하지만 try-catch-finally 블럭과 CLR(공용 언어 런타임) 예외 시스템 같은 기타 오류 처리 방법은 설명하지 않습니다.


Page_Error 이벤트를 사용하는 방법

Page_Error 이벤트는 페이지 수준에서 발생하는 오류를 잡는 방법을 제공합니다. 다음 예제 코드처럼 간단히 오류 정보를 표시하거나 이벤트를 기록하거나 다른 동작을 수행할 수 있습니다.

이 예제는 null 예외를 발생시켜 Page_Load 이벤트에서 강제로 오류가 발생하도록 합니다. 다음 절차에 따라 Page_Error 이벤트를 테스트하는 초기 페이지를 만듭니다.
  1. 다음 단계에 따라 PageEvent.aspx라는 이름의 새 파일을 프로젝트에 추가합니다.
    1. Microsoft Visual Studio .NET을 엽니다.
    2. 솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 누르고 추가를 가리킨 다음 Web Form 추가를 누릅니다.
    3. 이름 텍스트 상자에 PageEvent.aspx를 입력한 다음 열기를 누릅니다.
  2. 아래 코드를 PageEvent.aspx에 추가합니다.
    <script language=C# runat="server">
         void Page_Load(object sender, System.EventArgs e)
         {
              throw(new ArgumentNullException());
         }
    
         public void Page_Error(object sender,EventArgs e)
         {
              Exception objErr = Server.GetLastError();
              string err = "<b>Error Caught in Page_Error event</b><hr><br>" + 
    	             "<br><b>Error in: </b>" + Request.Url.ToString() +
    	             "<br><b>Error Message: </b>" + objErr.Message.ToString()+
    	             "<br><b>Stack Trace:</b><br>" + 
              Server.GetLastError().ToString();
              EventLog.WriteEntry("MyWebform.aspx",err,EventLogEntryType.Error);
              Server.ClearError();
              Response.Redirect("ErrorPage");
         }
    </script> 
  3. 파일 메뉴에서 PageEvent.aspx 저장을 누릅니다.
  4. 페이지를 마우스 오른쪽 단추로 누른 다음 브라우저에서 보기를 눌러 페이지를 실행합니다. 코드 사양에 따라 오류가 발생하고 보고됩니다.
코드는 Server.ClearError를 호출합니다. 이렇게 하면 Application_Error 이벤트를 계속 처리하는 오류가 방지됩니다.

참고: .aspx 페이지에서 Page_Load 이벤트와 같은 이벤트를 사용할 때 AutoEventWireup 특성 설정을 알고 있어야 합니다. Visual Studio .NET을 사용하는 경우 Visual Studio .NET이 기본적으로 추가하는 템플릿 코드에 이 특성이 @ Page 지시문과 함께 나열됩니다. AutoEventWireup 특성은 기본적으로 False로 설정됩니다. AutoEventWireupTrue로 설정되어 있지 않으면 Page_Load 코드는 절대 호출되지 않으며 그 결과 브라우저는 빈 페이지를 렌더링합니다.

또한 @ Page 지시문에서 Inherits 특성을 주목해야 합니다. Inherits가 설정된 경우 페이지를 탐색하기 전에 프로젝트를 빌드해야 합니다. 먼저 프로젝트를 빌드하지 않으면 다음과 같은 오류 메시지가 나타납니다.

'Project.PageEvent'는 유효한 형식이 아닙니다.

 

Application_Error 이벤트를 사용하는 방법

Page_Error 이벤트와 비슷하게 Application_Error 이벤트를 사용하여 응용 프로그램에서 발생하는 오류를 잡을 수 있습니다. 이벤트가 적용되는 응용 프로그램의 범위가 넓으므로 응용 프로그램 오류 정보를 기록하거나 다른 응용 프로그램 수준 오류를 처리할 수 있습니다.

다음 예제는 앞의 Page_Error 이벤트 코드 예제를 기반으로 하며 Page_Error 이벤트가 Page_Load 이벤트의 오류를 잡지 못하는 경우 실행됩니다. Application_Error 이벤트는 응용 프로그램의 Global.asax 파일에 지정됩니다. 이 절에서는 간단하게 새로운 페이지를 만들어 예외를 발생시키고, Global.asax 파일의 Application_Error 이벤트에서 오류를 잡고, 이벤트 로그에 기록하는 절차를 설명합니다. 다음 단계는 Application_Error 이벤트를 사용하는 방법을 보여 줍니다.

  1. AppEvent.aspx라는 이름의 새 파일을 프로젝트에 추가합니다.
  2. 아래 코드를 AppEvent.aspx에 추가합니다.
    <script language=C# runat="server">
        void Page_Load(object sender, System.EventArgs e)
        {
             throw(new ArgumentNullException());
        }
    </script>
  3. 파일 메뉴에서 AppEvent.aspx 저장을 누릅니다.
  4. Application_Error 이벤트를 Global.asax 파일에 추가하여 AppEvent.aspx 페이지의 Page_Load 이벤트에서 발생하는 오류를 잡습니다. 이벤트 로그를 사용하려면 System.Diagnostics 네임스페이스에 대해 다른 using 문을 Global.asax에 추가해야 합니다.

    아래 코드를 Global.asax 파일에 추가합니다.
    using System.Diagnostics;
    
    protected void Application_Error(object sender, EventArgs e)
    {
         Exception objErr = Server.GetLastError();
         string err = "<b>Error Caught in Application_Error event</b><hr><br>" + 
    	"<br><b>Error in: </b>" + Request.Url.ToString() +
    	"<br><b>Error Message: </b>" + objErr.Message.ToString()+ 
    	"<br><b>Stack Trace:</b><br>" + 
    	Server.GetLastError().ToString();
          EventLog.WriteEntry("Project.AppEvent.aspx",err,EventLogEntryType.Error);
          Server.ClearError();
    }
  5. Global.asax 파일을 저장합니다.
  6. Visual Studio .NET의 빌드 메뉴에서 빌드를 누릅니다.
  7. 페이지를 마우스 오른쪽 단추로 누른 다음 브라우저에서 보기를 누릅니다. 오류 메시지가 Application_Error 이벤트를 참조하고 이전 Page_Error 이벤트 예제와는 약간 다른 스택 추적을 표시합니다.


Web.config 파일을 사용하는 방법

Server.ClearError를 호출하지 않거나 Page_Error 또는 Application_Error 이벤트에서 오류를 잡지 않은 경우 오류는 Web.config 파일의 <customErrors> 구역에 있는 설정에 따라 처리됩니다. <customErrors> 구역에서 리디렉션 페이지를 기본 오류 페이지(defaultRedirect)로 지정하거나 발생하는 HTTP 오류 코드를 기반으로 특정 페이지를 지정할 수 있습니다. 또한 나타나는 오류 메시지를 사용자 지정할 수 있습니다.

오류가 발생하였는데 응용 프로그램의 이전 수준에서 잡지 못한 경우 사용자 지정 페이지가 표시됩니다. 이 절에서는 Server.ClearError가 절대 호출되지 않도록 Global.asax 파일을 수정하는 방법을 보여 줍니다. 결과적으로 오류를 잡는 마지막 지점인 Web.config 파일에서 오류가 처리됩니다.
  1. 이전 예제에 나타난 Global.asax 파일을 엽니다.
  2. Server.ClearError 줄을 주석으로 처리하여 Web.config 파일에 오류가 발생할 수 있도록 합니다.
  3. 변경 내용을 Global.asax에 저장합니다. 이제 코드는 다음과 비슷하게 나타납니다.
    using System.Diagnostics;
    
    protected void Application_Error(object sender, EventArgs e)
    {
         Exception objErr = Server.GetLastError();
         string err = "<b>Error Caught in Application_Error event</b><hr><br>" + 
         	     "<br><b>Error in: </b>" + Request.Url.ToString() +
         	     "<br><b>Error Message: </b>" + objErr.Message.ToString()+ 
         	     "<br><b>Stack Trace:</b><br>" + 
         	     Server.GetLastError().ToString();
         EventLog.WriteEntry("Project.AppEvent.aspx",err,EventLogEntryType.Error);
         //Server.ClearError();
    }
  4. 다음 코드를 <customErrors> 구역에 추가하여 사용자를 사용자 지정 페이지로 리디렉션합니다.
    <customErrors defaultRedirect
    ="http://hostName/applicationName/errorStatus.htm" mode="On"> </customErrors>
    참고: 관련 웹 서버와 응용 프로그램 이름을 참조하도록 defaultRedirect 특성에서 파일 경로를 수정해야 합니다.
  5. 이 수준에서 잡힌 오류는 기본 오류 페이지로 보내지기 때문에 ErrorStatus.htm이라는 이름의 오류 페이지를 만들어야 합니다. 사용자에게 표시하는 내용을 제어하기 위해 이 방법을 사용하는 것이므로 이 예제에서는 오류 페이지로 .htm 페이지를 사용합니다. 다음 코드를 ErrorStatus.htm에 추가합니다.
    <HTML>
    <HEAD>
    <TITLE></TITLE>
    <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
    </HEAD>
    <BODY>
         <b>Custom Error page!</b>
         <br>
         You have been redirected here from the &lt;customErrors&gt; 
    section of the Web.config file. </BODY> </HTML>
  6. 코드를 테스트하려면 파일을 저장하고 프로젝트를 빌드한 다음 브라우저에서 AppEvent.aspx를 봅니다. 오류가 발생하면 ErrorStatus.htm 페이지로 리디렉션됩니다.
<customErrors> 구역에 있는 defaultRedirect 특성의 값으로 기본 오류 페이지를 참조할 수 있지만 HTTP 오류 코드를 기반으로 하는 특정 페이지로 리디렉션하도록 지정할 수 있습니다. <error> 자식 요소는 이 옵션을 허용합니다. 예를 들면 다음과 같습니다.
<customErrors 
defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On"> <error statusCode="404" redirect="filenotfound.htm" /> </customErrors>
참고: <customErrors> 구역의 defaultRedirect에 지정된 페이지는 .htm 파일입니다. Page_ErrorApplication_Error 예제 처럼 .aspx 페이지에서 GetLastError를 사용하려면 리디렉션이 발생하기 전에 세션 변수나 다른 방법에서 예외를 저장해야 합니다.

<customErrors> 구역은 On으로 설정된 mode 특성을 포함하고 있습니다. mode 특성은 오류 리디렉션이 발생하는 방법을 제어하는 데 사용됩니다. 예를 들어, 응용 프로그램을 개발 중이라면 대부분 사용자에게 익숙한 오류 페이지로 리디렉션되는 것보다 실제 ASP.NET 오류 메시지를 표시하는 것이 더 낫습니다. mode 특성을 다음과 같이 설정할 수 있습니다.
  • On: 처리되지 않은 예외는 지정된 defaultRedirect 페이지로 사용자를 리디렉션합니다. 이 모드는 주로 프로덕션 환경에서 사용됩니다.
  • Off: 예외 정보가 표시되고 defaultRedirect 페이지로 리디렉션되지 않습니다. 이 모드는 주로 개발 환경에서 사용됩니다.
  • RemoteOnly: localhost를 사용하여 로컬 컴퓨터에 있는 사이트에 액세스하는 사용자에게만 예외 정보가 표시됩니다. 다른 모든 사용자는 defaultRedirect 페이지로 리디렉션됩니다. 이 모드는 주로 디버깅에 사용됩니다.

+ Recent posts