◇ ASP에러 처리의 처음과 끝

JSP가 갖고 있는 장점중의 하나가 Exception(Error)처리가 뛰어 나다는 것입니다. 철저한 Exception Class를 상속해 가면서 마치

작은 그물에서 큰 그물로 이어가는 에러 처리 기법은 프로그래머를 매우 정신적으로 여유있게 해주는 기능 중에 하나 입니다.

ASP의 경우 3.0으로 업그레이드 되면서 ASPError객체를 제공함으로써 기존의 Err객체의 단점을 개선하기는 했지만 이 역시도

내부서버오류 앞에서는 전혀 무용지물입니다.

아쉽지만 그래도 에러를 잡아 낼 수 있는 방법이 무엇이 있는지 알아 보도록 하겠습니다.

(참고로 자바스크립트 에러는 웹브러우저가 자동으로 에러를 찾아 줍니다.)


1. Response.End를 이용한 에러 잡아 들이기

에러를 잡는 가장 고전적인 방법입니다.

ASP코드의 중간에

Response.Write "여기 까지는 이상이 없습니다."

Response.End

라고 사용하면 에러가 발생되는 라인을 알아 낼 수 있는 방법입니다.

하지만 이 방법은 프로그램의 라인이 많으면 반복해서 사용해야 함으로 효율이 떨어지고 IE의 버퍼에

문제 있는 코드가 있다면 계속 오류 발생하여 버퍼를 다 지우고 IE를 모두 닫았다가 열어야 하는 번거로움이 있습니다.

하지만 위의 방법은 가장 간단하고 별 다른 코드 입력이 없기 때문에 아직도 많이 쓰여지고 있습니다.

특히 SQL문 실행 과정에서 에러가 나는 부분은 아래처럼 함으로 확인 할 수 있습니다.

esponse.Write sql

Response.end


2. Err객체를 이용한 에러 처리하기

아래와 같이 에러가 있는 파일을 작성합니다.

Err.asp로 저장하고 불러 옵니다.

<HTML><BODY>
<%
Dim su1, su2, hap, cha, gob, div
su1=100 : su2=0

hap=su1+su2 : cha = su1-su2 : gob = su1 * su2 : div = su1 / su2
Response.Write "두수의 더하기 : " & hap & "<BR>"
Response.Write "두수의 빼기: " & cha & "<BR>"
Response.Write "두수의 곱하기 : " & gob & "<BR>"
Response.Write "두수의 나누기 : " & div & "<BR>"
%>
</BODY></HTML>

위의 에러의 경우 전 두대의 컴퓨터로 테스트를 해보았습니다.

서버상에서의 결과 화면

다른 클라이언트에서의 결과 화면 입니다.

같은 에러에 대해서 다른 화면이 보이고 있습니다. 어떤 때는 에러의 원인이 보이고 어떤 때에는

골치아픈 HTTP 500 내부 서버 오류가 나오고 있습니다. IIS를 정지하고 버퍼를 지우고 다 해보았지만 결과는 같았습니다.

위의 경우 해결 방법은 Response.end를 중간 중간에 심어서 테스트 하는 1번의 방법을 이용하면 찾아 낼 수 있습니다.

이런 상황이 계속 되면 성질 급한 사람은 포기를 하던 아니면 오기로 매달리는 겁니다.밤 새도록...

이번에는 Err객체를 이용해서 에러를 잡아 보겠습니다. 아래의 소스처럼 수정하고 실행시킵니다.

Err2.asp로 저장하고 불러 옵니다.

<%
Option Explicit
On Error Resume Next
%>
<HTML><BODY>
<%
Dim su1, su2, hap, div

su1=100 : su2=0 : hap=su1+su2 : div = su1 / su2

Response.Write "두수의 더하기 : " & hap & "<BR>"
Response.Write "두수의 나누기 : " & div & "<BR>"

If Err.Number > 0 then
Response.Write "에러가 있습니다."
Err.Clear
else
Response.Write "에러가 없습니다."
End if

%>

</BODY></HTML>

아래는 2대의 컴퓨터의 결과 화면입니다. 자세히 원인은 모르지만 페이지 자체적으로 Err객체는 에러를 알아 내고 있습니다.

Option Explicit 는 변수 선언 확인문 입니다. 선언되지 않은 변수는 사용할 수 없어서 변수로 인한 오류를 막을 수 있는좋은 방법입니다.

On Error Resume Next문은 에러가 나도 계속 진행하라는 선언문입니다. 그래야 에러 원인을 알 수 있습니다.

Err.Number는 에러가 난 갯수를 갖고 있는 객체 입니다. 따라서 에러가 발생하면 에러 갯수로 에러를 알 수 있습니다.

Err.Clear는 반드시 선언해야 합니다. 에러를 Err객체 목록에서 지우는 역활을 합니다.

아래와 같이 소스를 수정하고 테스트 합니다.

Err3.asp로 저장하고 불러 옵니다.

<%
Option Explicit
On Error Resume Next
%>
<HTML><BODY>
<%
Dim su1, su2, hap, div

su1=100 : su2=0 : hap=su1+su2 : div = su1 / su2

Response.Write "두수의 더하기 : " & hap & "<BR>"
Response.Write "두수의 나누기 : " & div & "<BR>"

If Err.Number > 0 then
Response.Write "에러가 있습니다.<BR><BR>"
Response.Write "ASP에 지정된 에러 번호:" & Err.Number & "<BR>"
Response.Write "에러 원인 : " & Err.Description & "<BR>"
Response.Write "에러를 발생 시킨 객체 :" & Err.Source & "<BR>"
Err.Clear
else
Response.Write "에러가 없습니다.<BR>"
End if

%>

</BODY></HTML>

결과는 아래와 같습니다. 좀더 자세한 결과가 출력 되었습니다.

Err객체의 경우 어느 라인에서 에러가 났는지 알아낼 방법이 없습니다.


3. IE의 기능을 이용한 에러 잡기(HTTP 500 내부서버 오류 잡아냄)

아래처럼 소스를 작성하고 IE에서 확인 합니다. ("%>" ASP표식이 빠져있습니다.)

Err4.asp로 저장하고 불러 옵니다.

<HTML><BODY>
<%
Response.clear
Response.Write "A" & "<BR>"
Response.Write "B" & "<BR>"


</BODY></HTML>

아래는 결과 화면입니다. 역시 HTTP 500 - 내부 서버 오류가 뜹니다.

IE를 열고 [도구]메뉴의 [인터넷 옵션]을 클릭합니다.

[고급]탭의 [HTTP 오류 메시지 표시] 체크를 풀어 줍니다.

[확인]을 누르고 페이지를 다시 불러 온 결과입니다. 내부 서버 오류의 원인이 보이고 있습니다.

이 방법은 DB관련 내부서버 오류도 잡아 내는 기능을 갖고 있습니다.

위의 방법 중에서 3번이 가장 정확히 HTTP 500 - 내부 서버 오류를 찾아 냈습니다. 3번의 방법은 한번만 설정해 두면 편리할 것입니다.

평상시에 Option Explicit문을 선언하는 습관을 갖으셨으면 좋겠습니다.

그리고 Err객체도 완전한건 아니지만 많은 도움이 될 것입니다.


4. IIS에 사용자가 에러 페이지 만들어 추가하기

1. 아래의 내용을 error500.asp 로 해서 IIS 기본 웹사이트에 등록할 경우 c:\winnt\Help\iisHelp\common폴더에 저장합니다.


<%Set objError = Server.GetLastError%>

<html>
<body bgcolor=#fcffef>
<h4>에러 이름 : 500 내부 서버 오류입니다.</h4>
<hr>
ASPError.Number : 0x<%= Hex(objError.Number) %><br>
<font color="red">
ASPError.Source : <%= Server.HTMLEncode(objError.Source) %><br>
</font>
ASPError.Category : <%= objError.Category %><br>
ASPError.File : <%= objError.File %><br>
<font color="blue">
ASPError.Line : <%= objError.Line %><br>
ASPError.Column : <%= objError.Column %><br>
</font>
ASPError.Description : <%= objError.Description %><br>
<hr>
<input type="submit" value="다시 읽기" onclick="location.reload()">
<input type="submit" value="돌아가기" onclick="history.back()">

</body>
</html>

 

2. 에러를 적용하려는 프로젝트를 선택하고 [등록정보]로 들어갑니다.
 


3. [사용자 정의 오류]탭을 선택하고 500;100을 선택하고 [등록 정보 편집] 버튼을 클릭합니다.
 


4. 메시지 형식을 [URL]로 바꿉니다.
 


5. 메시지 형식을 URL로 지정하고 URL은 같은 사이트의 가상 디렉토리를 지정합니다.
    실제로 저는 기본 웹사이트를 사용함으로 IIS에서 열어보면
[/IISHelp/common/]이라는 폴더를 발견할 수 있습니다.
    이 가상 디렉토리는 실제로
c:\winnt\Help\iisHelp\common로 매핑 되어 있습니다.
 


6. 정상적으로 등록된 것이 보입니다.
 


7. 잘못된 ASP파일을 작성합니다. test.asp로 저장합니다.

<%
option explicit

Dim str

str = "<body>안녕하세요..?"
      & " 반갑습니다."

Response.Write str
%>
 


8. 에러 원인이 자세하게 출력 되었습니다.
 


9. 에러를 수정하고 다시 읽기 버튼을 누르면 결과가 제대로 보입니다.

수정된 test.asp파일

<%
option explicit

Dim str

str = "<body>안녕하세요..?" _
      & " 반갑습니다."

Response.Write str
%>


10. 정상적으로 출력 되었습니다.
 


2007/11/22 15:00 2007/11/22 15:00

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다