다음을 통해 공유


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

업데이트: 2007년 11월

이 문을 사용하면 코드를 실행하면서 특정 코드 블록에서 발생할 수 있는 오류의 일부 또는 전부를 처리할 수 있습니다.

Try
    [ tryStatements ]
    [ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
    [ catchStatements ]
    [ Exit Try ] ]
[ Catch ... ]
[ Finally
    [ finallyStatements ] ]
End Try

구성 요소

  • tryStatements
    선택적 요소. 오류가 발생할 수 있는 문입니다. 복합 문도 가능합니다.

  • Catch
    선택적 요소. 여러 Catch 블록을 사용할 수 있습니다. Try 블록을 처리하는 동안 예외가 발생하면 각 Catch 문을 텍스트 순서대로 검사하여 예외(throw된 예외를 나타내는 exception)를 처리했는지 여부를 확인합니다.

  • exception
    선택적 요소. 임의의 변수 이름입니다. exception의 초기 값은 throw된 오류 값입니다. Catch와 함께 사용되어 catch된 예외를 지정합니다. 이를 생략하면 Catch 문에서 모든 예외를 catch합니다.

  • type
    선택적 요소. 클래스 필터의 형식을 지정합니다. exception의 값이 type에 의해 지정된 형식이거나 파생 형식인 경우 식별자가 예외 개체에 바인딩됩니다.

  • When
    선택적 요소. When 절이 있는 Catch 문은 expression이 True인 경우에만 예외를 catch합니다. When 절은 예외의 형식을 확인한 다음에만 적용되며 expression은 예외를 나타내는 식별자를 참조할 수도 있습니다.

  • expression
    선택적 요소. Boolean으로 암시적으로 변환될 수 있어야 합니다. 일반 필터를 설명하는 임의의 식입니다. 일반적으로 오류 번호로 필터링하는 데 사용됩니다. When 키워드와 함께 사용되어 오류가 catch되는 상황을 지정합니다.

  • catchStatements
    선택적 요소. 연결된 Try 블록에서 발생하는 오류를 처리하는 문입니다. 복합 문도 가능합니다.

  • Exit Try
    선택적 요소. Try...Catch...Finally 구조를 중단하는 키워드입니다. End Try 문 바로 다음의 코드를 사용하여 실행을 다시 시작합니다. Finally 문도 여전히 실행됩니다. Finally 블록에서는 이 키워드를 사용할 수 없습니다.

  • Finally
    선택적 요소. Finally 블록은 실행이 Try 문의 일부를 벗어날 때 항상 실행됩니다.

  • finallyStatements
    선택적 요소. 다른 모든 오류 처리가 완료된 후 실행되는 문입니다.

  • End Try
    Try...Catch...Finally 구조를 끝냅니다.

설명

Try 블록과 Catch 블록은 별개의 블록이므로 Try 블록의 지역 변수를 Catch 블록에 사용할 수 없습니다. 둘 이상의 블록에서 변수를 사용하려면 Try...Catch...Finally 구조의 외부에서 변수를 선언해야 합니다.

Try 블록은 오류가 발생할 수 있는 코드를 포함하고 Catch 블록은 실제로 발생하는 오류를 처리하는 코드를 포함합니다. Try 블록에서 오류가 발생하면 처리를 위해 적절한 Catch 문으로 프로그램 제어가 전달됩니다. exception 인수는 Exception 클래스의 인스턴스이거나 Exception 클래스에서 파생되는 클래스의 인스턴스입니다. Exception 클래스 인스턴스는 Try 블록에서 발생한 오류에 상응합니다. 이 인스턴스에는 오류 번호와 메시지를 비롯하여 오류에 대한 정보가 포함되어 있습니다.

Catch 문에서 exception 인수를 지정하지 않은 경우에는 모든 종류의 시스템 또는 응용 프로그램 예외가 catch됩니다. 이러한 종류의 Catch 문은 항상 Try...Catch...Finally 구조에서 예상되는 특정 예외를 모두 catch한 후에 마지막 Catch 블록으로 사용해야 합니다. exception 인수가 없는 Catch 뒤에 나오는 Catch 블록에는 제어 흐름이 도달할 수 없습니다.

네트워크 공유에 호스팅되는 응용 프로그램과 같은 부분 신뢰 상태에서 Try...Catch...Finally는 해당 호출이 포함된 메서드가 호출되기 전에 발생하는 보안 예외를 catch하지 않습니다. 다음 예제를 서버 공유에서 실행하면 "Sub System.Security.SecurityException: 요청하지 못했습니다."라는 오류가 발생합니다. 보안 예외에 대한 자세한 내용은 SecurityException 클래스를 참조하십시오.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button1.Click
    Try
        Process.Start("https://www.microsoft.com")
    Catch ex As Exception
        MsgBox("Can't load Web page" & vbCrLf & ex.Message)
    End Try
End Sub

이러한 부분 신뢰 상태에서는 Process.Start 문을 별도의 Sub에 두어야 합니다. 이렇게 하면 첫 번째 Sub를 호출하지 못하며 Process.Start를 포함하는 Sub가 시작되고 보안 예외가 생성되기 전에 Try...Catch에서 이를 catch할 수 있습니다.

참고:

Try 문에 적어도 하나의 Catch 블록을 포함하지 않는 경우 Finally 블록을 포함해야 합니다.

예제

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

Public Sub TryExample()
    Dim x As Integer = 5   ' Declare variables.
    Dim y As Integer = 0
    Try                    ' Set up structured error handling.
        x = x \ y          ' Cause a "Divide by Zero" error.
    Catch ex As Exception When y = 0        ' Catch the error.
        Beep()
        MsgBox("You tried to divide by 0.") ' Show an explanatory message.
    Finally
        Beep()             ' This line is executed no matter what.
    End Try
End Sub

참고 항목

참조

End 문

Err 개체(Visual Basic)

Exit 문(Visual Basic)

On Error 문(Visual Basic)

Exception

GoTo 문