On Error 문(Visual Basic)

오류 처리 루틴을 사용하도록 설정하고 프로시저 내 루틴 위치를 지정합니다. 오류 처리 루틴을 사용하지 않도록 설정하는 데에도 사용할 수 있습니다. On Error 문은 구조화되지 않은 오류 처리에 사용되며 구조적 예외 처리 대신 사용할 수 있습니다. 구조적 예외 처리는 .NET에 기본 제공되어 있으며 일반적으로 더 효율적이므로 애플리케이션에서 런타임 오류를 처리할 때 권장됩니다.

오류 처리 또는 예외 처리 없이 발생하는 런타임 오류는 치명적입니다. 오류 메시지가 표시되고 실행이 중지됩니다.

참고 항목

Error 키워드는 이전 버전과의 호환성을 위해 지원되는 Error 문에도 사용됩니다.

구문

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

부분

용어 정의
GoToline 필수 line 인수에 지정된 줄에서 시작하는 오류 처리 루틴을 사용하도록 설정합니다. line 인수는 줄 레이블이나 줄 번호입니다. 런타임 오류가 발생하면 제어가 지정된 줄로 분기되어 오류 처리기가 활성화됩니다. 지정된 줄은 On Error 문과 동일한 프로시저에 있어야 합니다. 그렇지 않으면 컴파일 시간 오류가 발생합니다.
GoTo 0 현재 프로시저에서 사용하도록 설정된 오류 처리기를 사용하지 않도록 설정하고 Nothing으로 다시 설정합니다.
GoTo -1 현재 프로시저에서 사용하도록 설정된 예외를 사용하지 않도록 설정하고 Nothing으로 다시 설정합니다.
Resume Next 런타임 오류가 발생하면 오류가 발생한 문 바로 다음 문으로 제어가 이동하고 해당 지점부터 실행이 계속되도록 지정합니다. 개체에 액세스할 때 On Error GoTo 대신 이 형식을 사용합니다.

설명

참고 항목

구조화되지 않은 예외 처리 및 On Error 문을 사용하는 대신 가능하면 코드에서 구조적 예외 처리를 사용하는 것이 좋습니다. 자세한 내용은 Try...Catch...Finally 문을 참조하세요.

"사용하도록 설정된" 오류 처리기는 On Error 문에 의해 사용하도록 설정되는 처리기입니다. "활성" 오류 처리기는 오류를 처리하는 과정에 있는 사용하도록 설정된 처리기입니다.

오류 처리기가 활성화된 동안(오류 발생과 Resume, Exit Sub, Exit Function 또는 Exit Property 문 사이) 오류가 발생하면 현재 프로시저의 오류 처리기가 오류를 처리할 수 없습니다. 제어는 호출 프로시저로 돌아갑니다.

호출 프로시저에 사용하도록 설정된 오류 처리기가 있는 경우 해당 처리기가 활성화되어 오류를 처리합니다. 호출 프로시저의 오류 처리기도 활성화된 경우 제어는 사용하도록 설정되었지만 비활성화된 오류 처리기를 찾을 때까지 이전 호출 프로시저를 통해 다시 전달됩니다. 그러한 오류 처리기가 발견되지 않으면 오류는 실제로 발생한 지점에서 치명적입니다.

오류 처리기가 호출 프로시저에 제어를 다시 전달할 때마다 해당 프로시저가 현재 프로시저가 됩니다. 오류가 프로시저의 오류 처리기에 의해 처리되면 Resume 문으로 지정된 지점에서 현재 프로시저의 실행이 다시 시작됩니다.

참고 항목

오류 처리 루틴은 Sub 프로시저 또는 Function 프로시저가 아닙니다. 줄 레이블이나 줄 번호로 표시된 코드 섹션입니다.

Number 속성

오류 처리 루틴은 Err 개체의 Number 속성 값을 사용하여 오류의 원인을 확인합니다. 다른 오류가 발생하기 전이나 오류를 일으킬 수 있는 프로시저가 호출되기 전에 루틴은 Err 개체의 관련 속성 값을 테스트하거나 저장해야 합니다. Err 개체의 속성 값은 가장 최근 오류만 반영합니다. Err.Number와 연관된 오류 메시지는 Err.Description에 포함되어 있습니다.

Throw 문

Err.Raise 메서드에서 발생한 오류는 Exception 속성을 Exception 클래스의 새로 만들어진 인스턴스로 설정합니다. 파생된 예외 형식의 예외 발생을 지원하기 위해 언어에서 Throw 문이 지원됩니다. 이는 throw될 예외 인스턴스인 단일 매개 변수를 사용합니다. 다음 예에서는 이러한 기능을 기존 예외 처리 지원과 함께 사용하는 방법을 보여 줍니다.

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

On Error GoTo 문은 예외 클래스에 관계없이 모든 오류를 트랩합니다.

오류 발생 시 다음 다시 시작

On Error Resume Next를 사용하면 런타임 오류를 발생시킨 이 문 바로 다음 문이나 On Error Resume Next 문이 포함된 프로시저 중 가장 최근 호출 바로 다음 문으로 실행이 계속됩니다. 이 문을 사용하면 런타임 오류에도 불구하고 실행을 계속할 수 있습니다. 프로시저 내의 다른 위치로 제어를 전송하는 대신 오류가 발생할 수 있는 위치에 오류 처리 루틴을 배치할 수 있습니다. 다른 프로시저가 호출되면 On Error Resume Next 문이 비활성화되므로 해당 루틴 내에서 인라인 오류를 처리하려면 호출된 각 루틴에서 On Error Resume Next 문을 실행해야 합니다.

참고 항목

다른 개체에 액세스하는 동안 생성된 오류를 처리할 때는 On Error GoTo보다 On Error Resume Next 구문이 더 나을 수 있습니다. 개체와 상호 작용할 때마다 Err를 확인하면 코드에서 어떤 개체에 액세스했는지에 대한 모호함이 제거됩니다. 어떤 개체가 Err.Number에 오류 코드를 넣었는지 확인할 수 있을 뿐만 아니라 어떤 개체가 원래 오류를 생성했는지(Err.Source에 지정된 개체)도 확인할 수 있습니다.

오류 발생 시 GoTo 0

On Error GoTo 0은 현재 프로시저에서 오류 처리를 사용하지 않도록 설정합니다. 프로시저에 줄 번호 0이 포함되어 있더라도 오류 처리 코드의 시작으로 라인 0을 지정하지 않습니다. On Error GoTo 0 문이 없으면 프로시저가 종료될 때 발생하는 오류 처리기가 자동으로 사용하지 않도록 설정됩니다.

오류 발생 시 GoTo -1

On Error GoTo -1은 현재 프로시저에서 예외를 사용하지 않도록 설정합니다. 프로시저에 줄 번호 -1이 포함되어 있더라도 오류 처리 코드의 시작으로 라인 -1을 지정하지 않습니다. On Error GoTo -1 문이 없으면 프로시저가 종료될 때 예외가 자동으로 사용하지 않도록 설정됩니다.

오류가 발생하지 않았을 때 발생하는 오류 처리 코드가 실행되지 않도록 하려면 다음 조각과 같이 오류 처리 루틴 바로 앞에 Exit Sub, Exit Function 또는 Exit Property 문을 배치합니다.

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

여기서 오류 처리 코드는 Exit Sub 문 뒤에 있고 End Sub 문 앞에 위치하여 프로시저 흐름과 구분됩니다. 프로시저의 어느 위치에나 오류 처리 코드를 배치할 수 있습니다.

포착되지 않은 오류

개체가 실행 파일로 실행 중일 때 개체의 포착되지 않은 오류가 제어 애플리케이션으로 반환됩니다. 개발 환경 내에서는 적절한 옵션이 설정된 경우에만 포착되지 않은 오류가 제어 애플리케이션에 반환됩니다. 디버깅 중에 설정해야 하는 옵션, 설정 방법, 호스트가 클래스를 만들 수 있는지 여부에 대한 설명은 호스트 애플리케이션 설명서를 참조하세요.

다른 개체에 액세스하는 개체를 만드는 경우 해당 개체가 전달하는 처리되지 않은 오류를 모두 처리해야 합니다. 그럴 수 없으면 Err.Number의 오류 코드를 사용자 오류 중 하나에 매핑한 다음 개체 호출자에게 다시 전달합니다. VbObjectError 상수에 오류 코드를 추가하여 오류를 지정해야 합니다. 예를 들어, 오류 코드가 1052인 경우 다음과 같이 할당합니다.

Err.Number = vbObjectError + 1052

주의

Windows DLL(동적 연결 라이브러리) 호출 중 시스템 오류는 예외를 발생시키지 않으며 Visual Basic 오류 잡기로 포착할 수 없습니다. DLL 함수를 호출할 때 각 반환 값의 성공 또는 실패 여부를 확인해야 하며(API 사양에 따라), 실패할 경우에는 Err 개체의 LastDLLError 속성 값을 확인합니다.

예시

이 예에서는 먼저 On Error GoTo 문을 사용하여 프로시저 내에서 오류 처리 루틴의 위치를 지정합니다. 이 예에서 0으로 나누려고 하면 오류 번호 6이 생성됩니다. 오류는 오류 처리 루틴에서 처리된 다음 오류를 발생시킨 문으로 제어가 반환됩니다. On Error GoTo 0 문은 오류 잡기를 끕니다. 그런 다음 On Error Resume Next 문을 사용하여 다음 문에서 생성된 오류에 대한 컨텍스트를 확실히 알 수 있도록 오류 잡기를 연기합니다. Err.Clear는 오류가 처리된 후 Err 개체의 속성을 지우는 데 사용됩니다.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      Err.Clear() ' Clear Err object fields.
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

요구 사항

네임스페이스:Microsoft.VisualBasic

어셈블리: Visual Basic 런타임 라이브러리(Microsoft.VisualBasic.dll)

참고 항목