Visual Basic의 구조적 예외 처리 개요

Visual Basic에서는 강력하고 포괄적인 오류 처리기를 갖춘 프로그램을 만들고 유지 관리하는 데 사용할 수 있는 구조적 예외 처리를 지원합니다. 구조적 예외 처리는 Select Case 또는 While과 같은 제어 구조를 예외, 보호된 코드 블록 및 필터와 결합하여 실행 도중 오류를 발견하고 이에 대응할 수 있도록 만든 코드입니다.

Try...Catch...Finally 문을 사용하여 오류가 발생할 가능성이 있는 코드 블록을 보호할 수 있습니다. 예외 처리기는 중첩될 수 있으며 각 블록에서 선언된 변수는 지역 범위를 갖습니다.

비디오에 링크 관련된 비디오 데모를 참조 어떻게 할 i: 처리 되지 않은 예외를 이메일?.

Try...Catch...Finally 문

다음 코드에서는 Try...Catch...Finally 문의 구조를 보여 줍니다.

Try
    ' Starts a structured exception handler.
    ' Place executable statements that may generate 
    ' an exception in this block.
Catch '[optional filters]
    ' This code runs if the statements listed in 
    ' the Try block fail and the filter on the Catch statement is true.
'[Additional Catch blocks]
Finally
    ' This code always runs immediately before
    ' the Try statement exits.
End Try
' Ends a structured exception handler.

Try...Catch...Finally 예외 처리기의 Try 블록에는 예외를 모니터링할 코드 섹션이 포함되어 있습니다. 이 섹션이 실행되는 도중 오류가 발생하면 Visual Basic에서는 해당 오류와 일치하는 조건이 있는 부분을 찾을 때까지 Try...Catch...Finally 내의 각 Catch 문을 검사합니다. 조건이 일치하는 부분을 찾으면 Catch 블록의 첫 번째 코드 줄로 제어가 전달됩니다. 일치하는 Catch 문이 없을 경우 예외가 발생한 블록이 포함된 바깥쪽 Try...Catch...Finally 블록의 Catch 문으로 검색이 계속 진행됩니다. 현재 프로시저가 일치하는 Catch 블록을 찾을 때까지 이 프로세스는 전체 스택에 걸쳐 계속됩니다. 그래도 일치하는 문을 찾지 못하면 오류가 발생합니다.

Finally 섹션의 코드는 Catch 블록 코드의 실행 여부에 관계없이 항상 마지막에, 즉 오류 처리 블록이 범위를 상실하기 직전에 실행됩니다. 파일을 닫거나 개체를 해제하기 위한 정리 코드는 Finally 섹션에 포함합니다. 예외를 catch할 필요는 없지만 리소스를 정리해야 할 경우 Finally 섹션이 아니라 Using 문을 사용하는 것이 좋습니다. 자세한 내용은 Using 문(Visual Basic)을 참조하십시오.

Catch 블록의 오류 필터링

Catch 블록에서는 특정 오류를 필터링하기 위해 세 가지 옵션을 사용할 수 있습니다. 첫 번째 옵션에서는 다음 코드와 같이 오류가 예외 클래스(여기서는 ClassLoadException)에 따라 필터링됩니다.

Try
    ' "Try" block.
Catch e as ClassLoadException
    ' "Catch" block.
Finally
    ' "Finally" block.
End Try

ClassLoadException 오류가 발생할 경우 지정된 Catch 블록의 코드가 실행됩니다.

두 번째 오류 필터링 옵션에서는 Catch 섹션에서 모든 조건식에 따라 필터링할 수 있습니다. 이러한 형식의 Catch 필터는 일반적으로 다음 코드와 같이 특정 오류 번호를 테스트하는 데 사용됩니다.

Try
   ' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
   ' "Catch" block.
Finally
   ' "Finally" block.
End Try

일치하는 오류 처리기를 찾는 경우 Visual Basic에서는 해당 오류 처리기 내의 코드를 실행한 다음 Finally 블록으로 제어를 전달합니다.

참고

Catch 블록을 찾아서 예외를 처리하려고 할 때 각 블록의 처리기는 일치하는 블록이 발견될 때까지 계속 평가됩니다. 이러한 처리기는 함수에 대한 호출일 수 있기 때문에 의도하지 않은 결과가 발생할 수도 있습니다. 예를 들면 함수 호출로 인해 예외 처리를 종료하는 다른 Catch 블록의 코드에 사용되는 공용 변수가 변경될 수 있습니다.

세 번째 방법으로 두 옵션을 함께 사용하여 예외를 처리할 수 있습니다. Catch 문은 가장 구체적인 문에서 가장 일반적인 문의 순서로 진행해야 합니다. Catch 블록은 Exception에서 파생된 모든 예외를 자체적으로 catch하므로 항상 Finally 앞의 마지막 블록이어야 합니다.

Try…Catch 블록 밖으로 분기

Catch 블록에서 처음 Try 문 또는 End Try 문으로 분기할 수는 있지만 바깥쪽 Try…Catch 블록으로 분기할 수는 없습니다. 다음 그림에서는 이를 보여 줍니다.

Try Catch 분기

구조적 예외 처리기 예제

다음 예제에서는 Try...Catch...Finally 문을 사용하는 또 다른 간단한 오류 처리기를 보여 줍니다.

Option Strict On
Imports System.IO

Module Module1
    Private Const FileName As String = "TestFile.data"

    Public Sub Main()

        ' First, create a new data file and write some data to the file.
        ' 1. Create the new, empty data file.
        If File.Exists(FileName) Then
            File.Delete(FileName)
        End If
        Dim fs As New FileStream(FileName, FileMode.CreateNew)

        ' 2. Create a BinaryWriter object for the data.
        Dim writer As New BinaryWriter(fs)

        ' 3. Write some sample data to the file.
        For i = 0 To 10
            writer.Write(i)
        Next i
        writer.Close()
        fs.Close()

        ' Now read from the file you just made.
        ' 1. Create a BinaryReader object for the data stream.
        fs = New FileStream(FileName, FileMode.Open, FileAccess.Read)
        Dim reader As New BinaryReader(fs)

        ' 2. Read data from TestFile.data. The loop terminates with an
        ' EndOfStreamException when an attempt is made to read past
        ' the end of the stream.
        Try
            ' This loop terminates with an EndOfStreamException when it 
            ' reaches the end of the stream.
            While True
                Console.WriteLine(reader.ReadInt32())
            End While
            Console.WriteLine("The data was read with no error.")
        ' 3. Report the first error that is caught, if there is one.
        Catch eosExcep As EndOfStreamException
            ' This Catch block is executed when the reader attempts
            ' to read past the end of the stream.
            Console.WriteLine("End-of-stream exception occurred.")
        Catch IOExcep As System.IO.IOException
            ' For this Catch block, some other error occurred before
            ' the end of stream was reached. Print the standard
            ' exception message.
            Console.WriteLine(IOExcep.Message)
        Finally
            ' The Finally block is always executed.
            Console.WriteLine("Executing the Finally block.")
            reader.Close()
            fs.Close()
        End Try
    End Sub

End Module

Finally 블록은 앞의 Catch 블록에서 발생하는 동작에 관계없이 항상 실행됩니다. 구조적 예외 처리에서는 Resume 또는 Resume Next를 사용할 수 없습니다.

참고

위의 예제에서 IOException 클래스나 EndOfStreamException 클래스를 제외한 모든 예외는 처리되지 않은 채 호출자로 다시 전파됩니다.

참고 항목

작업

예외 처리 문제 해결(Visual Basic)

참조

Try...Catch...Finally 문(Visual Basic)

BinaryReader

BinaryWriter

FileStream

개념

예외 처리 소개(Visual Basic)

오류의 종류(Visual Basic)

비구조적 예외 처리 개요(Visual Basic)

기타 리소스

예외 처리 작업(Visual Basic)