바라기의 이야기

웹 개발시 오류처리 본문

Develop/Domino

웹 개발시 오류처리

baragi76 2010. 3. 16. 09:30

웹으로 개발된 싸이트 경우, 사용자들의 다양한 OS, 브라우저 환경으로 개발자가 미쳐 생각못한 에러들이 발생할 수 있습니다. 이런 에러들을 기록으로 남겨 개발자가 싸이트를 개선해나가기 위한 한가지 아이디어입니다. 일단 제 머리속에서 상상되는 에러 유형 세가지는

1. 일반(General) 에러
2. 자바스크립트 에러
3. 에이전트 수행 에러

먼저 1번
아시다시피 노츠에는 $$ReturnGeneralError 라는 에러화면용 양식이 있습니다. 에러 발생시 이 양식이 표시되는데, 대부분 경우 단순히 에러메세지 뿌려주는 정도에 그칩니다. 여기에 추가적으로 버튼을 만들어서 사용자가 그 에러를 관리자/담당자에게 메일 혹은 문서로 알리는 방법입니다. $$ReturnGeneralError 양식은 특수양식이라 $$ViewTemplateDefault처럼 읽기모드로 열리기 때문에, 양식을 submit 시킬수가 없습니다. 따라서 방법은 여러가지 있겠지만....

<form>
<a href=어쩌구>이 에러를 관리자에게 보내시겠습니까?</a>
<input type=hidden name=xxx value=yyy>
</form>

위와 같은 식으로 이 양식안에 강제로 form태크와 hidden 필드를 만듭니다. 그리고 사용자가 버튼을 눌렀을때 에러 report용 양식을 팝업으로 띄우고나서, 이 팝업 양식의 onLoad 이벤트안에 window.opener.document.forms[0].xxx.value 이런식으로 $$ReturnGeneralError 양식의 hidden 필드값에 접근합니다. 이 hidden 필드로는 MessageString(에러메세지), HTTP_User_Agent(사용자 브라우저 환경), Path_Info(참조된 URL 경로)등을 이용하면 되겠죠. 이런 값들을 팝업 양식에서 가져다가 양식을 onLoad 이벤트에서 submit 시켜버리면 문서는 자동으로 처리되게 됩니다.

2. 자바스크립트 에러
양식안에다가 window.onerror = errorCapture
이런식으로 한줄 적어주고나서
function errorCapture(msg, url, lineno){

}
위와 같은 함수를 적어주면 됩니다.
그러면 페이지에 자바스크립트 에러가 발생할지, errorCapture라는 함수가 자동으로 호출되며 msg, url, lineno (변수명은 변경
가능) 변수로 에러메세지, URL 경로, 에러가 발생한 라인넘버가 자동으로 들어오게 됩니다. 그러면

function errorCapture(msg, url, lineno){
window.onerror = null
window.location = '에러report용 양식 경로?OpenForm&msg='
+msg+'&url='+url+'&lineno='+lineno;
window.onerror = errorCapture
}

대충 위와 같은 식으로 그 세개의 변수값을 url 뒤에 붙여 에러 report용 양식을 불러주면 됩니다. 그럼 그 양식안에서 url 뒤 값을 짤
라 해당 필드에 값을 셋팅하고 자동으로 양식을 submit 시켜버리면 역시 문서는 자동 처리되게 됩니다.

3-1. 에이전트 에러
에이전트 맨 상단에
on Error goto errorCapture

위와 같이 적고
맨 아래에

errorCapture :
if Erl > 0 then
print "<script>window.location = '에러report용 양식 경로?OpenForm&msg='
+Error$+'&url='+db.title+"/"+db.path+"/"+agent.name+'&lineno='+CStr(Erl)+"'</scr
ipt>"
end if

대강 이런식으로 적으면 에러메세지, 에이전트 경로, 에러발생 라인 넘버 등이 url 뒤에 붙어서 에러 report 용 양식을 부르게 됩니다.
그 다음은 역시 마찬가지

3-2. 에이전트 에러 (WebQueryOpen)
아시겠지만 WebQueryOpen 이벤트에서 수행되는 에이전트 경우 에러가 발생해도 위 방법 적용이 안됩니다.
그래서 이 경우
errorCapture :
if Erl > 0 then
doc.isError = 1
doc.errorMsg = Error$
doc.errorPath = db.title+"/"+db.path+"/"+agent.name
doc.errorLine = Erl
end if

대강 위와 같은 식으로 적고나서, 이 에이전트를 수행한 양식안에다가

<script>
if( "isError필드" == 1 )
window.location = '에러 report용 양식 경로?OpenForm&msg='+"errorMsg필드"
+'&url='+"errorPath필드"+'&lineno='+"errorLine필드"
</script>

위와 같은 식으로 적으면 에러 발생시 양식이 열리면서 report용 양식으로 바로 이동하며, 그 다음은 역시 마찬가지입니다.