asp(vbscript) 에서 try catch ( 예외처리 ) 로그 저장
asp의 vbscript에서도 try catch와 같이 예외처리를 할수 있다. (비슷한 표현이지만 처리방식은 틀리다.) 비록 방식은 동일하지는 않지만 비슷하게 표현할수 있는 방법이다.
try catch에 대상부분을 sub이나 Function으로 감싸고 On Error Resume Next 감싸고 If Err.Number <> 0 Then 판단 디버깅하는 방법이다.
참고로 화면에 에러를 출력하거나 iis로그에 저장하는 방법도 있다.
※ On Error Resume Next를 페이지 상단에 쓴 체..작업을 하면 디버깅하는데 상당히 애를 먹는다. 이런식으로 소스를 sub 이나 function 단위로 감싸고 호출하는 방식을 취하면 디버깅도 상당히 편하고 소스자체도 모듈화가 되기때문에 유용하리라고 본다.
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'> <strong>오류번호</strong></th>" Response.Write " <th width='80%' align='left'> <strong>설명</strong></th>" Response.Write "</tr>" Response.Write "<tr>" Response.Write " <td width='20%'> " & intErrNumber & "</td>" Response.Write " <td width='80%'> " & 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 단위로 감싸고 호출하는 방식을 취하면 디버깅도 상당히 편하고 소스자체도 모듈화가 되기때문에 유용하리라고 본다.
댓글
댓글 쓰기