처리되지 않은 예외 처리(VB)

작성자 : Scott Mitchell

예제 코드 살펴보기 및 다운로드 (다운로드 방법)

프로덕션의 웹 애플리케이션에서 런타임 오류가 발생하면 나중에 진단될 수 있도록 개발자에게 알리고 오류를 기록하는 것이 중요합니다. 이 자습서에서는 ASP.NET 런타임 오류를 처리하고 처리되지 않은 예외가 ASP.NET 런타임까지 버블링할 때마다 사용자 지정 코드를 실행하는 한 가지 방법을 살펴봅니다.

소개

ASP.NET 애플리케이션에서 처리되지 않은 예외가 발생하면 ASP.NET 런타임까지 버블링되어 이벤트가 발생하고 Error 적절한 오류 페이지가 표시됩니다. 세 가지 유형의 오류 페이지가 있습니다. 런타임 오류 사망의 노란색 화면(YSOD); 예외 세부 정보 YSOD; 및 사용자 지정 오류 페이지. 이전 자습서에서는 원격 사용자에 대한 사용자 지정 오류 페이지와 로컬로 방문하는 사용자에 대한 예외 세부 정보 YSOD를 사용하도록 애플리케이션을 구성했습니다.

사이트의 모양과 느낌과 일치하는 사용자에게 친숙한 사용자 지정 오류 페이지를 사용하는 것이 기본 런타임 오류 YSOD에 선호되지만 사용자 지정 오류 페이지를 표시하는 것은 포괄적인 오류 처리 솔루션의 한 부분일 뿐입니다. 프로덕션의 애플리케이션에서 오류가 발생하면 예외의 원인을 파악하고 해결할 수 있도록 개발자에게 오류 알림을 제공하는 것이 중요합니다. 또한 나중에 오류를 검사하고 진단할 수 있도록 오류 세부 정보를 기록해야 합니다.

이 자습서에서는 처리되지 않은 예외의 세부 정보에 액세스하여 기록할 수 있도록 하고 개발자에게 알림을 받는 방법을 보여줍니다. 이 자습서 다음에는 약간의 구성 후에 개발자에게 런타임 오류를 자동으로 알리고 세부 정보를 기록하는 오류 로깅 라이브러리를 살펴봅니다.

참고

이 자습서에서 검사한 정보는 고유하거나 사용자 지정된 방식으로 처리되지 않은 예외를 처리해야 하는 경우에 가장 유용합니다. 예외를 기록하고 개발자에게 알리기만 하면 되는 경우 오류 로깅 라이브러리를 사용하는 것이 좋습니다. 다음 두 자습서에서는 이러한 두 라이브러리에 대한 개요를 제공합니다.

이벤트가 발생할 때Error코드 실행

이벤트는 개체에 흥미로운 일이 발생했음을 알리고 다른 개체가 응답으로 코드를 실행할 수 있는 메커니즘을 제공합니다. ASP.NET 개발자는 이벤트 측면에서 생각하는 데 익숙합니다. 방문자가 특정 Button을 클릭할 때 일부 코드를 실행하려는 경우 해당 Button 이벤트에 Click 대한 이벤트 처리기를 만들어 코드를 배치합니다. 처리되지 않은 예외가 발생할 때마다 ASP.NET 런타임이 이벤트를 발생 Error 시키는 경우 오류의 세부 정보를 기록하는 코드가 이벤트 처리기에서 진행됩니다. 하지만 이벤트에 대한 이벤트 처리기를 만들려면 어떻게 해야 할까 Error 요?

이벤트는 Error 요청의 수명 동안 HTTP 파이프라인의 특정 단계에서 발생하는 클래스의 많은 이벤트 HttpApplication 중 하나입니다. 예를 들어 HttpApplication 클래스의 BeginRequest 이벤트는 모든 요청이 시작될 때 발생합니다. 보안 AuthenticateRequest 모듈이 요청자를 식별하면 해당 이벤트가 발생합니다. 이러한 HttpApplication 이벤트는 페이지 개발자에게 요청 수명 동안 다양한 지점에서 사용자 지정 논리를 실행할 수 있는 수단을 제공합니다.

이벤트에 대한 HttpApplication 이벤트 처리기는 라는 Global.asax특수 파일에 배치할 수 있습니다. 웹 사이트에서 이 파일을 만들려면 이름이 Global.asax인 전역 애플리케이션 클래스 템플릿을 사용하여 웹 사이트의 루트에 새 항목을 추가합니다.

Global.asax라는 이름의 글로벌 애플리케이션 클래스 템플릿을 사용하여 웹 사이트의 루트에 새 항목을 추가하여 웹 사이트에 이 파일을 만드는 스크린샷

그림 1: 웹 애플리케이션에 추가 Global.asax
(전체 크기 이미지를 보려면 클릭)

Visual Studio에서 만든 파일의 Global.asax 내용과 구조는 WAP(웹 애플리케이션 프로젝트) 또는 WSP(웹 사이트 프로젝트)를 사용하는지 여부에 따라 약간 다릅니다. WAP를 사용하여 는 Global.asaxGlobal.asax.vb의 두 개의 별도 파일 Global.asax 로 구현됩니다. 파일에는 Global.asax 파일을 참조 .vb 하는 지시문만 포함 @Application 됩니다. 관심 있는 이벤트 처리기는 파일에 정의 Global.asax.vb 됩니다. WSP의 경우 단일 파일만 만들어 Global.asax지고 이벤트 처리기는 블록에 <script runat="server"> 정의됩니다.

Visual Studio의 전역 애플리케이션 클래스 템플릿에서 WAP에서 만든 파일에는 Global.asax 각각 이벤트 , 및 Application_Error에 대한 HttpApplication 이벤트 처리기인 , Application_AuthenticateRequestError라는 Application_BeginRequest이벤트 BeginRequestAuthenticateRequest처리기가 포함됩니다. 웹 애플리케이션이 시작될 때, Session_EndApplication_End새 세션이 시작될 때, 애플리케이션이 종료될 때 및 세션이 각각 종료될 때 발생하는 이벤트 처리기인 , Session_Start, 및 라는 Application_Start이벤트 처리기도 있습니다. Visual Studio에서 WSP에서 만든 파일에는 Global.asax , , Application_StartSession_Start, Application_EndSession_End 이벤트 처리기만 Application_Error포함됩니다.

참고

ASP.NET 애플리케이션을 배포할 때 파일을 프로덕션 환경에 복사 Global.asax 해야 합니다. WAP에서 만든 파일은 Global.asax.vb 이 코드가 프로젝트의 어셈블리로 컴파일되므로 프로덕션에 복사할 필요가 없습니다.

Visual Studio의 전역 애플리케이션 클래스 템플릿에서 만든 이벤트 처리기는 완전하지 않습니다. 이벤트 처리기 의 이름을 지정하여 모든 HttpApplication 이벤트에 대한 이벤트 처리기를 Application_EventName추가할 수 있습니다. 예를 들어 다음 코드를 Global.asax 파일에 추가하여 이벤트에 대한 AuthorizeRequest이벤트 처리기를 만들 수 있습니다.

Sub Application_AuthorizeRequest(ByVal sender As Object, ByVal e As EventArgs)
    ' Event handler code
End Sub

마찬가지로 필요하지 않은 전역 애플리케이션 클래스 템플릿에서 만든 이벤트 처리기를 제거할 수 있습니다. 이 자습서에서는 이벤트에 대한 Error 이벤트 처리기만 필요합니다. 파일에서 Global.asax 다른 이벤트 처리기를 자유롭게 제거할 수 있습니다.

참고

HTTP 모듈은 이벤트에 대한 HttpApplication 이벤트 처리기를 정의하는 또 다른 방법을 제공합니다. HTTP 모듈은 웹 애플리케이션 프로젝트 내에 직접 배치하거나 별도의 클래스 라이브러리로 분리할 수 있는 클래스 파일로 만들어집니다. 클래스 라이브러리로 분리할 수 있으므로 HTTP 모듈은 이벤트 처리기를 만들기 HttpApplication 위한 보다 유연하고 재사용 가능한 모델을 제공합니다. 파일이 있는 웹 애플리케이션과 관련된 반면 Global.asax HTTP 모듈은 어셈블리로 컴파일할 수 있으며, 이때 웹 사이트에 HTTP 모듈을 추가하는 것은 폴더에 Bin 어셈블리를 삭제하고 에 Web.config모듈을 등록하는 것만큼 간단합니다. 이 자습서에서는 HTTP 모듈 만들기 및 사용을 살펴보지 않지만 다음 두 자습서에서 사용되는 두 개의 오류 로깅 라이브러리는 HTTP 모듈로 구현됩니다. HTTP 모듈의 이점에 대한 자세한 내용은 HTTP 모듈 및 처리기를 사용하여 플러그형 ASP.NET 구성 요소 만들기를 참조하세요.

처리되지 않은 예외에 대한 정보 검색

이 시점에서 이벤트 처리기가 있는 Global.asax 파일이 Application_Error 있습니다. 이 이벤트 처리기가 실행되면 개발자에게 오류를 알리고 세부 정보를 기록해야 합니다. 이러한 작업을 수행하려면 먼저 발생한 예외의 세부 정보를 결정해야 합니다. Server 개체의 GetLastError 메서드 를 사용하여 이벤트가 발생시킨 처리되지 않은 예외 Error 의 세부 정보를 검색합니다.

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)
End Sub

메서드는 GetLastError .NET Framework 모든 예외에 대한 기본 형식인 형식Exception의 개체를 반환합니다. 그러나 위의 코드에서 에서 반환 GetLastError 된 Exception 개체를 개체로 HttpException 캐스팅합니다. Error ASP.NET 리소스를 처리하는 동안 예외가 throw되어 이벤트가 발생하는 경우 throw된 예외는 내에서 HttpException래핑됩니다. Error 이벤트를 발생시킨 실제 예외를 얻으려면 속성을 사용합니다 InnerException . Error 존재하지 않는 페이지에 대한 요청과 같은 HTTP 기반 예외로 인해 이벤트가 발생한 경우 이 HttpException throw되지만 내부 예외는 없습니다.

다음 코드에서는 를 GetLastErrormessage 사용하여 이벤트를 트리거한 Error 예외에 대한 정보를 검색하고 HttpException 라는 lastErrorWrapper변수에 를 저장합니다. 그런 다음, 원래 예외의 형식, 메시지 및 스택 추적을 세 개의 문자열 변수에 저장하여 lastErrorWrapper 이 이벤트를 트리거한 실제 예외(HTTP 기반 예외의 경우)인지 또는 요청을 처리하는 동안 throw된 Error 예외에 대한 래퍼인지 확인합니다.

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)

    Dim lastError As Exception = lastErrorWrapper
    If lastErrorWrapper.InnerException IsNot Nothing Then
        lastError = lastErrorWrapper.InnerException
    End If

    Dim lastErrorTypeName As String = lastError.GetType().ToString()
    Dim lastErrorMessage As String = lastError.Message
    Dim lastErrorStackTrace As String = lastError.StackTrace
End Sub

이 시점에서 예외의 세부 정보를 데이터베이스 테이블에 기록하는 코드를 작성하는 데 필요한 모든 정보가 있습니다. 요청된 페이지의 URL 및 현재 로그온한 사용자의 이름과 같은 다른 유용한 정보 조각과 함께 관심 있는 각 오류 세부 정보(형식, 메시지, 스택 추적 등)에 대한 열이 있는 데이터베이스 테이블을 만들 수 있습니다. Application_Error 그런 다음 이벤트 처리기에서 데이터베이스에 연결하고 테이블에 레코드를 삽입합니다. 마찬가지로 코드를 추가하여 개발자에게 이메일을 통해 오류를 알릴 수 있습니다.

다음 두 자습서에서 검사된 오류 로깅 라이브러리는 이러한 기능을 기본 제공하므로 이 오류 로깅 및 알림을 직접 빌드할 필요가 없습니다. 그러나 이벤트가 발생하고 있으며 이벤트 처리기를 사용하여 오류 세부 정보를 기록하고 개발자에게 알릴 수 있음을 Application_Error 설명하기 Error 위해 오류가 발생할 때 개발자에게 알리는 코드를 추가해 보겠습니다.

처리되지 않은 예외가 발생할 때 개발자에게 알림

프로덕션 환경에서 처리되지 않은 예외가 발생하는 경우 오류를 평가하고 수행해야 하는 작업을 결정할 수 있도록 개발 팀에 경고하는 것이 중요합니다. 예를 들어 데이터베이스에 연결하는 동안 오류가 발생하는 경우 연결 문자열 두 번 검사 웹 호스팅 회사와 지원 티켓을 열어야 합니다. 프로그래밍 오류로 인해 예외가 발생한 경우 나중에 이러한 오류를 방지하기 위해 추가 코드 또는 유효성 검사 논리를 추가해야 할 수 있습니다.

네임스페이스의 .NET Framework 클래스를 System.Net.Mail 사용하면 전자 메일을 쉽게 보낼 수 있습니다. 클래스는 MailMessage 전자 메일 메시지를 나타내며 , , From, SubjectBodyAttachments와 같은 To속성을 가 있습니다. 는 SmtpClass 지정된 SMTP 서버를 사용하여 개체를 보내는 MailMessage 데 사용됩니다. SMTP 서버 설정은 의 요소에서 <system.net>Web.config file프로그래밍 방식으로 또는 선언적으로 지정할 수 있습니다. ASP.NET 애플리케이션에서 전자 메일 메시지를 보내는 방법에 대한 자세한 내용은 ASP.NET 웹 페이지 사이트에서 Email 보내기System.Net.Mail FAQ 문서를 검사.

참고

<system.net> 요소는 전자 메일을 보낼 때 클래스에서 SmtpClient 사용하는 SMTP 서버 설정을 포함합니다. 웹 호스팅 회사에 애플리케이션에서 전자 메일을 보내는 데 사용할 수 있는 SMTP 서버가 있는 것일 수 있습니다. 웹 애플리케이션에서 사용해야 하는 SMTP 서버 설정에 대한 자세한 내용은 웹 호스트의 지원 섹션을 참조하세요.

다음 코드를 Application_Error 이벤트 처리기에 추가하여 오류가 발생할 때 개발자에게 이메일을 보냅니다.

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)
    
    Dim lastError As Exception = lastErrorWrapper
    If lastErrorWrapper.InnerException IsNot Nothing Then
        lastError = lastErrorWrapper.InnerException
    End If

    Dim lastErrorTypeName As String = lastError.GetType().ToString()
    Dim lastErrorMessage As String = lastError.Message
    Dim lastErrorStackTrace As String = lastError.StackTrace

    Const ToAddress As String = "support@example.com"
    Const FromAddress As String = "support@example.com"
    Const Subject As String = "An Error Has Occurred!"

    ' Create the MailMessage object
    Dim mm As New MailMessage(FromAddress, ToAddress)
    mm.Subject = Subject
    mm.IsBodyHtml = True
    mm.Priority = MailPriority.High
  mm.Body = string.Format( _
"<html>" & vbCrLf & _
"  <body>" & vbCrLf & _
"  <h1>An Error Has Occurred!</h1>" & vbCrLf & _
"  <table cellpadding=""5"" cellspacing=""0"" border=""1"">" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">URL:</td>" & vbCrLf & _
"  <td>{0}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">User:</td>" & vbCrLf & _
"  <td>{1}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">Exception Type:</td>" & vbCrLf & _
"  <td>{2}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">Message:</td>" & vbCrLf & _
"  <td>{3}</td>" & vbCrLf & _
"  </tr>" & vbCrLf & _
"  <tr>" & vbCrLf & _
"  <tdtext-align: right;font-weight: bold"">Stack Trace:</td>" & vbCrLf & _
"  <td>{4}</td>" & vbCrLf & _
"  </tr> " & vbCrLf & _
"  </table>" & vbCrLf & _
"  </body>" & vbCrLf & _
"</html>", _
  Request.RawUrl, _
  User.Identity.Name, _
  lastErrorTypeName, _
  lastErrorMessage, _
  lastErrorStackTrace.Replace(Environment.NewLine, "<br />"))

    'Attach the Yellow Screen of Death for this error
    Dim YSODmarkup As String = lastErrorWrapper.GetHtmlErrorMessage()
    If Not String.IsNullOrEmpty(YSODmarkup) Then
        Dim YSOD As Attachment = _
            Attachment.CreateAttachmentFromString(YSODmarkup, "YSOD.htm")
        mm.Attachments.Add(YSOD)
    End If

    ' Send the email
    Dim smtp As New SmtpClient()
    smtp.Send(mm)
End Sub

위의 코드는 매우 길지만 대부분의 코드는 개발자에게 전송된 전자 메일에 표시되는 HTML을 만듭니다. 코드는 메서드(lastErrorWrapper)에서 반환된 HttpExceptionGetLastError 참조하여 시작합니다. 요청에 의해 발생한 실제 예외는 를 통해 lastErrorWrapper.InnerException 검색되고 변수 lastError에 할당됩니다. 형식, 메시지 및 스택 추적 정보는 에서 lastError 검색되고 세 개의 문자열 변수에 저장됩니다.

MailMessage 다음으로 라는 mm 개체가 만들어집니다. 이메일 본문은 HTML 형식이며 요청된 페이지의 URL, 현재 로그온한 사용자의 이름 및 예외에 대한 정보(형식, 메시지 및 스택 추적)를 표시합니다. 클래스에 대한 HttpException 멋진 점 중 하나는 GetHtmlErrorMessage 메서드를 호출하여 예외 세부 정보 YSOD(Yellow Screen of Death)를 만드는 데 사용되는 HTML을 생성할 수 있다는 것입니다. 이 메서드는 예외 세부 정보 YSOD 태그를 검색하고 첨부 파일로 전자 메일에 추가하는 데 사용됩니다. 주의 사항: 이벤트를 트리거한 Error 예외가 HTTP 기반 예외(예: 존재하지 않는 페이지에 대한 요청)인 경우 메서드는 GetHtmlErrorMessage 를 반환 null합니다.

마지막 단계는 을 보내는 것입니다 MailMessage. 이 작업은 새 SmtpClient 메서드를 만들고 해당 메서드를 호출하여 수행됩니다 Send .

참고

웹 애플리케이션에서 이 코드를 사용하기 전에 및 FromAddress 상수 support@example.com 의 값을 ToAddress 에서 오류 알림 전자 메일을 보내고 시작해야 하는 전자 메일 주소로 변경해야 합니다. 또한 의 섹션에서 Web.configSMTP 서버 설정을 <system.net> 지정해야 합니다. 사용할 SMTP 서버 설정을 확인하려면 웹 호스트 공급자에게 문의하세요.

이 코드를 사용하면 오류가 발생할 때마다 개발자가 오류를 요약하고 YSOD를 포함하는 전자 메일 메시지를 보냅니다. 이전 자습서에서는 Genre.aspx 방문하여 와 같은 Genre.aspx?ID=foo쿼리 문자열을 통해 잘못된 ID 값을 전달하여 런타임 오류를 설명했습니다. 파일이 있는 페이지를 방문하면 이전 자습서와 Global.asax 동일한 사용자 환경이 생성됩니다. 개발 환경에서는 예외 세부 정보 죽음의 노란색 화면이 계속 표시되며 프로덕션 환경에서는 사용자 지정 오류 페이지가 표시됩니다. 이 기존 동작 외에도 개발자는 이메일을 보냅니다.

그림 2 는 를 방문할 Genre.aspx?ID=foo때 받은 이메일을 보여줍니다. 전자 메일 본문에는 예외 정보가 요약되어 있으며 YSOD.htm 첨부 파일에는 예외 세부 정보 YSOD에 표시된 콘텐츠가 표시됩니다( 그림 3 참조).

예외 정보와 함께 수신된 이메일의 스크린샷.

그림 2: 처리되지 않은 예외가 있을 때마다 개발자가 Email 알림을 보냅니다.
(전체 크기 이미지를 보려면 클릭)

처리되지 않은 예외가 있을 때 개발자가 받은 이메일 알림의 스크린샷

그림 3: Email 알림에는 예외 세부 정보 YSOD를 첨부 파일로 포함합니다.
(전체 크기 이미지를 보려면 클릭)

사용자 지정 오류 페이지를 사용하는 것은 어떨까요?

이 자습서에서는 및 이벤트 처리기를 사용하여 Global.asaxApplication_Error 처리되지 않은 예외가 발생할 때 코드를 실행하는 방법을 보여 줍니다. 특히 이 이벤트 처리기를 사용하여 개발자에게 오류를 알립니다. 데이터베이스의 오류 세부 정보도 기록하도록 확장할 수 있습니다. 이벤트 처리기의 존재 Application_Error 는 최종 사용자의 환경에 영향을 주지 않습니다. 오류 세부 정보 YSOD, 런타임 오류 YSOD 또는 사용자 지정 오류 페이지와 같이 구성된 오류 페이지가 계속 표시됩니다.

사용자 지정 오류 페이지를 사용할 때 파일 및 Application_Error 이벤트가 필요한지 궁금 Global.asax 할 수 있습니다. 오류가 발생하면 사용자에게 사용자 지정 오류 페이지가 표시되므로 개발자에게 알리고 오류 세부 정보를 사용자 지정 오류 페이지의 코드 숨김 클래스에 기록하는 코드를 배치할 수 없는 이유는 무엇인가요? 사용자 지정 오류 페이지의 코드 숨김 클래스에 코드를 추가할 수 있지만 이전 자습서에서 살본 기술을 사용할 때 이벤트를 트리거한 Error 예외의 세부 정보에 액세스할 수 없습니다. GetLastError 사용자 지정 오류 페이지에서 메서드를 호출하면 가 반환됩니다Nothing.

이 동작의 이유는 사용자 지정 오류 페이지가 리디렉션을 통해 도달하기 때문입니다. 처리되지 않은 예외가 ASP.NET 런타임에 도달하면 ASP.NET 엔진은 이벤트(이벤트 처리기를 실행Application_Error)를 발생 Error 시킨 다음 를 실행하여 사용자를 사용자 지정 오류 페이지Response.Redirect(customErrorPageUrl)리디렉션합니다. 메서드는 Response.Redirect HTTP 302 상태 코드를 사용하여 클라이언트에 응답을 보내 브라우저에 새 URL, 즉 사용자 지정 오류 페이지를 요청하도록 지시합니다. 그러면 브라우저에서 이 새 페이지를 자동으로 요청합니다. 브라우저의 주소 표시줄이 사용자 지정 오류 페이지 URL로 변경되어 오류가 발생한 페이지와 별도로 사용자 지정 오류 페이지가 요청되었음을 알 수 있습니다( 그림 4 참조).

오류가 발생할 때 사용자 지정 오류 페이지 URL로 리디렉션되는 브라우저의 스크린샷.

그림 4: 오류가 발생하면 브라우저가 사용자 지정 오류 페이지 URL로 리디렉션됩니다.
(전체 크기 이미지를 보려면 클릭)

그 결과 서버가 HTTP 302 리디렉션으로 응답할 때 처리되지 않은 예외가 발생한 요청이 종료됩니다. 사용자 지정 오류 페이지에 대한 후속 요청은 새로운 요청입니다. 이 시점까지 ASP.NET 엔진은 오류 정보를 삭제했으며, 또한 이전 요청의 처리되지 않은 예외를 사용자 지정 오류 페이지에 대한 새 요청과 연결할 방법이 없습니다. 사용자 지정 오류 페이지에서 호출할 때 를 반환 null 하는 이유 GetLastError 입니다.

그러나 오류를 발생시킨 동일한 요청 중에 사용자 지정 오류 페이지를 실행할 수 있습니다. 메서드는 Server.Transfer(url) 지정된 URL로 실행을 전송하고 동일한 요청 내에서 처리합니다. 이벤트 처리기의 코드를 Application_Error 사용자 지정 오류 페이지의 코드 숨김 클래스로 이동하여 에서 다음 코드로 바꿀 수 있습니다 Global.asax .

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    ' Get the error details
    Dim lastErrorWrapper As HttpException = _
        CType(Server.GetLastError(), HttpException)

    If lastErrorWrapper.GetHttpCode() = 404 Then
        Server.Transfer("~/ErrorPages/404.aspx")
    Else
        Server.Transfer("~/ErrorPages/Oops.aspx")
    End If
End Sub

이제 처리되지 않은 예외가 Application_Error 발생하면 이벤트 처리기는 HTTP 상태 코드에 따라 적절한 사용자 지정 오류 페이지로 컨트롤을 전송합니다. 컨트롤이 전송되었으므로 사용자 지정 오류 페이지는 를 통해 Server.GetLastError 처리되지 않은 예외 정보에 액세스할 수 있으며 개발자에게 오류를 알리고 세부 정보를 기록할 수 있습니다. 호출은 Server.Transfer ASP.NET 엔진이 사용자를 사용자 지정 오류 페이지로 리디렉션하는 것을 중지합니다. 대신 사용자 지정 오류 페이지의 콘텐츠가 오류를 생성한 페이지에 대한 응답으로 반환됩니다.

요약

ASP.NET 웹 애플리케이션에서 처리되지 않은 예외가 발생하면 ASP.NET 런타임이 Error 이벤트를 발생시키고 구성된 오류 페이지를 표시합니다. Error 이벤트에 대한 이벤트 처리기를 만들어 개발자에게 오류를 알리거나, 세부 정보를 기록하거나, 다른 방식으로 처리할 수 있습니다. 파일 또는 HTTP 모듈에서 Global.asax 와 같은 Error이벤트에 대한 HttpApplication 이벤트 처리기를 만드는 방법에는 두 가지가 있습니다. 이 자습서에서는 파일에서 Global.asax 이메일 메시지를 통해 개발자에게 오류를 알리는 이벤트 처리기를 만드는 Error 방법을 보여 줍니다.

Error 이벤트 처리기를 만드는 것은 고유하거나 사용자 지정된 방식으로 처리되지 않은 예외를 처리해야 하는 경우에 유용합니다. 그러나 예외를 기록하거나 개발자에게 알리기 위해 사용자 고유 Error 의 이벤트 처리기를 만드는 것은 몇 분 안에 설정할 수 있는 무료 및 사용하기 쉬운 오류 로깅 라이브러리가 이미 있기 때문에 시간을 가장 효율적으로 사용하는 것은 아닙니다. 다음 두 자습서에서는 이러한 두 라이브러리를 살펴봅니다.

행복한 프로그래밍!

추가 정보

이 자습서에서 설명하는 topics 대한 자세한 내용은 다음 리소스를 참조하세요.