배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   Excel 버전:   공통
검색어:   디버깅,VBE,에러,핸들러
제목:   편리한 디버깅을 위한 준비
     
 

STEP
  STEP> 따라하기
 

※ 아래 Daily Tip은 곽승주 강사님이 제공해주신 내용입니다.

목수가 좋은 연장을 찾듯이 개발을 많이 하시는 분들은 좋은 개발 도구를 구하기 마련입니다. 개발도구가 갖추어야 할 덕목이 몇 가지 있지만 중요하게 여기는 기능 가운데 하나는 얼마나 디버깅하기 편리한 도구를 제공하는가 입니다. 필자는 늘 사용하는 VBE이지만 정작 VBE의 기능에 대해서는 무관심하게 지낸 편입니다.

오늘은 편리한 디버깅을 위한 프로시져(Procedure) 에 대한 이야기를 하고자 합니다.

대개의 프로시져( Sub이든 Function이든 간에 )는 다음과 같이 작성됩니다.

Sub demoProcedure
...
End Sub

그러나 조금 더 세심한 배려를 하는 경우 언제 닥칠지 모르는 미지의 에러에 대해 에러 핸들러를 작성하게 됩니다.

Sub demoProcedure
    On Error GoTo demoProcedure_Error
    ...
    Exit Sub
demoProcedure_Error:
    ...(에러처리)...
End Sub

On Error Goto 를 미리 선언함으로써 코드를 진행하는 도중 런타임에러를 만나게 되면 demoProcedure_Error 라는 레이블로 이동하게 될 것입니다.

위에서 한 발짝 더 나아가 다음과 같이 코드를 변경해보는 것은 어떨까요?

Public Sub demoProcedure()

    On Error GoTo demoProcedure_Error

    Err.Raise 1004

    On Error GoTo 0
    Exit Sub

demoProcedure_Error:
    Dim sContents As String

    sContents = "1. 오류 번호" & Err.Number & vbNewLine
    sContents = sContents & "2. 오류 설명" & Err.Description & vbNewLine
    sContents = sContents & "3. 오류 위치" & "Sub demoProcedure() of Module1"

    On Error GoTo 0
    MsgBox sContents, vbCritical, "Error Report"
End Sub

위의 demoProcedure에서는 에러를 만나는 경우 오류번호, 오류에 대한 설명, 그리고 오류가 일어난 프로시져의 이름과 위치를 MsgBox를 통해 보여줍니다. 위의 프로시져에서는 일부러 에러를 내기 위해 Err개체의 Raise메소드를 사용하였습니다. 따라서 이를 실행하면 바로 에러를 내고 MsgBox 에 에러에 대한 내용을 보여줍니다.

에러가 나면 당연히 에러가 난 프로시져에서 중단되므로 위의 내용이 그리 중요해 보이지 않을 수 있습니다.

그러나 종종 Userform에서 프로시져를 호출하다가 에러가 걸리는 경우 해당 프로시져에서 중단되는 것이 아니라 Userform1.Show와 같은 코드에서 중단되는 경우가 생깁니다. 그러면 일일이 F8키를 눌러가며 도대체 어느 프로시져에서 에러가 났는지 찾아 헤매게 됩니다.

위를 한 단계 발전시켜서 이 에러가 해결 가능한 것이라면 당연히 모종의 조치를 취해야 합니다. 그러나 처리 불가능 또는 예상하지 못하는 경우 그에 대한 에러를 보여주어야 합니다. 다음의 코드는 그러한 예를 보여줍니다.

440, 430 에러가 처리 가능하다면 이를 처리하고 나머지 모르는 또는 예상 못하는 에러(이 경우 1004번 에러)는 Case Else문 다음으로 돌려 MsgBox를 통해 알려주는 예입니다.

Public Sub demoProcedure()

     On Error GoTo demoProcedure_Error

     Err.Raise 1004

     On Error GoTo 0
     Exit Sub

demoProcedure_Error:
     Select Case Err.Number
     Case 440
       '// 440 에러에 대한 처리

   Case 430
       '// 430 에러에 대한 처리

   Case Else
       '// 예상할 수 없는 에러 처리
      Dim sContents As String

      sContents = "1. 오류 번호 " & Err.Number & vbNewLine
      sContents = sContents & "2. 오류 설명 " & Err.Description & vbNewLine
      sContents = sContents & "3. 오류 위치 " & "Sub demoProcedure() of Module1" & vbNewLine
      MsgBox sContents, vbCritical, "Error Report"
   End Select

   On Error GoTo 0
End Sub

여기서 더욱 더 발전을 시킨다면 에러 메시지를 개발한 장본인에게 메일을 보내도록 할 수도 있을 것입니다. 메일의 형태로 보내는 것은 아니지만 마치 윈도우의 오류보고 보냄 기능처럼 말이죠.

그러나 실제 에러번호와 설명만으로 해결할 수 없는 경우가 있기 때문에 이러한 방법은 어느 정도 한계를 가지고 있습니다.