티스토리 뷰



좋은 품질 또는 안정성 있는 프로그램이란 다양한 사용자에 의해서 발생하는 다양한 상황에서도 예상할 수 있는 결과를 내는 프로그램입니다. 프로그래머가 생각하고 준비한 범위에서는 잘 동작하지만 그 이외의 경우에는 결과를 예상할 수 없는 프로그램을 좋은 프로그램이라 할 수 없습니다. 중요하게 기억해야할 점은 "완벽함"이 아니라 "예측 가능함"입니다. 철저한 프로그램 설계와 꼼꼼한 코딩으로 모든 경우의 수를 대비한 프로그램을 작성한다면 더욱 좋겠지만 이런 과정은 기간, 인원등 자원의 투입을 수반하게 되어 있고 코드의 크기와 비용이 커짐과 동시에 버그의 출현 가능성도 높아지게 마련입니다. 이러한 "예측 가능성"을 높여주는 대비책이 바로 실행중 예외 처리입니다.



비주얼베이직의 예외 처리 방법은 이전 버전 부터 사용했던 "On Error"문을 사용하는 방법과 C++/C#/Java등에서 사용하는 "Try...Catch"문을 사용하는 방법이 있습니다. 마이크로소프트에서는 되도록 구조적인 예외 처리 방법인 "Try...Catch"문을 사용하도록 권장하고 있으므로 이 부분을 집중적으로 다루겠습니다. 통상 예외처리는 파일이나 데이터베이스 등 시스템 기능이나 외부 시스템과의 인터페이스등에 사용하는데 형변환과 같이 내부적인 작업에도 실행중 예외 처리가 필요하므로 안정적인 프로그램 실행과 예외에 대한 적절한 대비를 위해서 구조적인 예외 처리 문을 적극 활용하는 것이 좋습니다.

Try
    ReportingClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded")
    MessageBox.Show(ReportingClient.UploadString(Branding.Web & "code/bug.php", "POST", _
        "version=" & Application.ProductVersion & "/" & Revision.Build & "&msg=" & Ex.ToString), _
        "Bug report submitted!", MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch SubEx As Net.WebException
    MessageBox.Show("Unable to submit report. " & Environment.NewLine & Ex.ToString, _
        "Unable to submit report", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
    ReportingClient.Dispose()
End Try

실행중 예외 처리 문장의 사용법은 간단합니다. 일단 예외 처리 연관 문장들은 위의 예제와 같이 Try...End Try로 묶습니다. 예외가 발생할 수 있는 실제 실행문은 Try 다음에 기술합니다. 그리고 혹시 발생할 가능성이 있는 예외(Exception)에 대하여는 Catch 문을 사용해서 예외가 발생했을 때의 상황을 처리합니다. Try 다음에 있는 문장 중에서 예외가 발생하면 그 즉시 실행은 해당 예외를 정의한 Catch문으로 이동하고 Try의 다음 문장들은 무시됩니다. 예외 발생 유무에 관계없이 Finally문이 호출되므로 예외에 대한 최종 마무리 처리를 이곳에 기술하면 됩니다. 

아무 내용도 기술하지 않은 Catch문이나  "Catch e As Exception"와 같이 기술하여 모든 예외를 받을 수는 있지만 구체적인 상황에 대비할 수 없는 한계가 있으므로 다양한 예외에 대해서 각각 구분하여 구체적으로 기술할 필요성이 있습니다. 예외의 종류와 예외 발생시 전달되는 정보등 구체적인 예외에 대해서는 https://msdn.microsoft.com/en-us/library/aa289505(v=vs.71).aspx를 참조합니다.

예외처리 과정에서 다룰 마지막 내용은 인위적으로 예외를 발생시킨다는 것으로 아래와 같이 Throw문을 통해서 프로그램 실행 과정에서 프로그래머가 예외를 프로그램 장치의 하나로 활용할 수 있도록 해줍니다.

Private Shared Function LoadCompressionDll() As Compressor
    Dim DLL As Reflection.Assembly = Reflection.Assembly.LoadFrom(ProgramConfig.CompressionDll)

    For Each SubType As Type In DLL.GetTypes
        If GetType(Compressor).IsAssignableFrom(SubType) Then Return CType(Activator.CreateInstance(SubType), Compressor)
    Next

    Throw New ArgumentException("Invalid DLL: " & ProgramConfig.CompressionDll)
End Function

일부 클래스나 함수를 사용할 때는 반드시 Try를 통한 예외 처리를 반드시 요구하는 경우도 있으므로 외부 모듈과 연계되는 로직의 경우에는 예외처리를 반드시 처리한다는 생각으로 코딩하는 것이 좋습니다.

※ 코드 참조 : http://synchronicity.sourceforge.net


댓글
댓글쓰기 폼