asp(vbscript) 에서 try catch ( 예외처리 ) 로그 저장

asp의 vbscript에서도 try  catch와 같이 예외처리를 할수 있다. (비슷한 표현이지만 처리방식은 틀리다.) 비록 방식은 동일하지는 않지만 비슷하게 표현할수 있는 방법이다.

try  catch에 대상부분을 sub이나 Function으로 감싸고 On Error Resume Next 감싸고 If Err.Number <> 0 Then 판단 디버깅하는 방법이다.

참고로 화면에 에러를 출력하거나 iis로그에 저장하는 방법도 있다.
<%@ ENABLESESSIONSTATE="False" Language="VBScript"  CodePage="65001"%>
<% 
Option Explicit 
Response.CharSet = "UTF-8"

Const IS_DEBUG_MODE  = True     ' 디버깅 모드 화면 프린트냐 로그기록이냐
Const ERR_PAGE   = "/commons/err.html" ' 클라이언트에게 보여줄 최종 에러 페이지

Sub PageMain
 On Error Resume Next  ' try
 Err.Raise 1014 ' 예제) 에러를 일으킴(실제 프로그래밍 구문이 들어갈곳)
 
 If Err.Number <> 0 Then  ' catch
  PrintToLog "End문오류"
 End If
End Sub

 '/**
 '* 개발시에는 에러내용을 화면에 출력하고 운용시에는 iis로그에 에러를 기록한다.(에러페이지로 리다이렉트)
 '*  iis로그에 저장시에는 로그속성에 확장속에 uriquery부분이 체크 되어있어야 한다.(2003은 디폴트 체크 xp는 체크 않되어 있음)
 '*
 '* @param string strUserError : 사용자 정의 에러문장
 '*
 '*/
 Public Sub PrintToLog(ByVal strUserError)
  Dim strErrTitle, strScriptError, strRunTimeError, arrErrNumber, intCnt
  Dim intErrNumber, strErrSource, strErrDescription
  intErrNumber  = Err.Number
  strErrSource  = Err.Source
  strErrDescription = Err.Description
  Err.Clear

  strScriptError = "VBScript 구문 오류는 VBScript 문 구조 중 VBScript 스크립팅 언어의 문법"
  strScriptError = strScriptError & "규칙을 하나 이상 위반할 경우 발생하는 오류입니다. VBScript 구문 오류는 "
  strScriptError = strScriptError & "프로그램이 실행되기 전에 프로그램을 컴파일하는 단계에서 발생합니다."
  strRunTimeError = "VBScript 런타임 오류는 VBScript 스크립트에서 시스템이 실행할 수 없는 동작을 수행하려고 " 
  strRunTimeError = strRunTimeError & "할 때 발생하는 오류입니다. VBScript 런타임 오류는 해당 스크립트가 실행"
  strRunTimeError = strRunTimeError & "되는 동안 또는 변수식이 평가되거나 메모리가 동적으로 할당될 때 발생합니다."
  arrErrNumber = Array(429,507,449,17,430,506,11,48,5020,5019,432,92,5008,51,505,481,5,5021,94,448,447, _
        445,438,451,504,503,502,424,91,7,28,14,6,35,9,5017,462,10,13,5018,500,458,450)
  
  If IS_DEBUG_MODE = True Then
   If intErrNumber >= 1005 And intErrNumber <= 1055 Then
    strErrTitle = strScriptError
   Else
    For intCnt = 0 To UBound(arrErrNumber)
     Response.Write intCnt
     If arrErrNumber(intCnt) = intErrNumber Then
      strErrTitle = strRunTimeError
      Exit For
     Else
      strErrTitle = ""  
     End If
    Next
   End If

   Response.Write "<font size='5'><strong>" & strErrSource & "</strong></font>"
   Response.Write strErrTitle
   Response.Write "<table border='1' cellspacing='0' cellpadding='0' bordercolordark='white'"
   Response.Write " bordercolorlight='black' width='100%'>"
   Response.Write "<tr bgcolor='#CCCCCC'>"
   Response.Write " <th width='20%' align='left'>&nbsp;<strong>오류번호</strong></th>"
   Response.Write " <th width='80%' align='left'>&nbsp;<strong>설명</strong></th>"
   Response.Write "</tr>"
   Response.Write "<tr>"
   Response.Write " <td width='20%'>&nbsp;" & intErrNumber & "</td>"
   Response.Write " <td width='80%'>&nbsp;" & strErrDescription & "</td>"
   Response.Write "</tr>"
   Response.Write "</table>"
   Response.Write strUserError
  Else
   Response.AppendToLog "gbError"&""&strUserError&""&CStr(intErrNumber)&""&strErrSource&""&strErrDescription&""
   Response.Redirect ERR_PAGE
  End If
 End Sub

PageMain
%>

※ On Error Resume Next를 페이지 상단에 쓴 체..작업을 하면 디버깅하는데 상당히 애를 먹는다. 이런식으로 소스를 sub 이나 function 단위로 감싸고 호출하는 방식을 취하면 디버깅도 상당히 편하고 소스자체도 모듈화가 되기때문에 유용하리라고 본다.

댓글