VB :: Lecture & TIPs

[VB.NET] 응용 프로그램 실행 중 예외 처리 하기

좋은 품질 또는 안정성 높은 응용 프로그램이란, 다수의 사용자에 의해서 발생하는 다양한 상황에서도 예상할 수 있는 결과를 도출할 수 있는 프로그램 일 것입니다. 개발자다 고려하고, 준비한 여러가지 경우 내에서는 잘 동작하지만, 이외 발생 할 수 있는 예외 사항이나 변수를 예상할 수 없는 프로그램을 좋은 프로그램이라 할 수 없습니다. 철저한 과정에 따른 프로그램 설계와 꼼꼼한 코딩으로 모든 경우의 수를 대비한 프로그램을 개발한다면 더욱 좋겠지만, 이러한 일련의 과정은 기간, 인원 등 자원의 투입을 수반하도록 되어 있고 코드의 크기와 비용이 커짐과 동시에 예상치 못한 오류의 등장 가능성도 높아지기 마련입니다. 이러한 “예측 가능성” 을 높여주는 대비책 중 한 가지가 실행 중 예외 처리입니다.

Visual Basic .NET 에서의 예외 처리 방법은 이전 버전 부터 전통적으로 사용했던 “On Error” 문을 사용하는 방법과 C++ / C# / Java 등에서 주로 사용하는 “Try … Catch” 문을 사용하는 방법이 있습니다. Microsoft 사 (社) 에서는 되도록 구조적인 예외 처리 방법인 “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” 와 같이 기술하여 모든 예외를 받을 수는 있지만 구체적인 상황에 대비할 수 없는 한계가 있으므로 다양한 예외에 대해서 각각 구분하여 구체적으로 기술할 필요성이 있습니다. 예외의 종류와 예외 발생시 전달되는 정보 등 구체적인 예외에 대해서는 MSDN 공식 문서, 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

 

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

고맙습니다.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: