다음을 통해 공유


비구조적 예외 처리 개요

업데이트: 2007년 11월

비구조적 예외 처리에서는 코드 블록 시작 부분에 On Error 문을 두어 코드 블록 내에서 발생하는 모든 오류를 처리합니다. On Error 문이 실행된 후 프로시저에서 예외가 발생하면 프로그램이 On Error 문에 지정된 line 인수로 분기합니다. 줄 번호 또는 줄 레이블인 line 인수는 예외 처리기의 위치를 나타냅니다.

원래 프로시저에서 다른 프로시저를 호출하고 호출된 프로시저에서 예외가 발생하는 경우가 있습니다. 이 경우 호출된 프로시저가 예외를 처리하지 않으면 호출한 프로시저로 예외가 다시 전파되고 실행이 line 인수로 분기합니다.

참고:

On Error를 사용하는 비구조적 오류 처리에서는 응용 프로그램의 성능이 저하되고 코드의 디버깅 및 유지 관리가 어렵습니다. 구조적 오류 처리 방법을 사용하는 것이 좋습니다. 자세한 내용은 Visual Basic의 구조적 예외 처리 개요를 참조하십시오.

On Error GoTo Line

On Error GoTo Line 문에서는 오류 처리 코드가 필수 요소인 line 인수에 지정된 줄에서 시작하는 것으로 가정합니다. 런타임 오류가 발생하면 이 인수에 지정된 줄 레이블이나 줄 번호로 제어가 분기하여 오류 처리기를 활성화합니다*.* 지정된 줄은 On Error GoTo Line 문과 같은 프로시저에 있어야 합니다. 그렇지 않으면 Visual Basic에서 컴파일러 오류를 생성합니다. 다음 예제는 줄 레이블이 있는 오류 처리기의 사용법을 설명합니다.

Sub TestSub
   On Error GoTo ErrorHandler
      ' Code that may or may not contain errors.
   Exit Sub

   ErrorHandler:
      ' Code that handles errors.
      Resume
End Sub

이 예제에는 ErrorHandler라는 오류 처리기가 있습니다. TestSub 서브루틴의 코드에서 오류가 생성되면 Visual Basic에서는 ErrorHandler 레이블 다음의 코드를 즉시 실행합니다. 오류 처리 블록의 끝에서 Resume 문은 오류가 처음 발생한 코드 줄로 제어를 다시 전달합니다. 서브루틴의 나머지 부분은 오류가 발생하지 않은 것처럼 계속 실행됩니다.

참고:

ExitSub 문은 오류 처리 블록 바로 앞에 와야 합니다. 그렇지 않으면 Visual Basic에서는 서브루틴의 끝에 도달할 때 오류 처리 코드가 실행되어 예기치 않은 결과가 발생합니다.

On Error Resume Next

On Error Resume Next 문은 런타임 오류가 발생할 때 오류가 발생한 문의 바로 다음 문으로 제어가 전달되도록 지정합니다. 그 지점에서 실행이 계속됩니다. On Error Resume Next를 사용하면 프로시저의 다른 위치로 제어를 전달하지 않고 오류가 발생할 위치에 오류 처리 루틴을 둘 수 있습니다.

참고:

프로시저가 다른 프로시저를 호출하는 경우 호출된 프로시저가 실행되는 동안 On Error Resume Next 문은 비활성화됩니다. 따라서, 호출된 프로시저 각각에 On Error Resume Next 문을 별도로 사용해야 합니다. 이러한 작업은 Resume Next 동작이 On Error Resume Next 문을 포함하는 프로시저에만 적용되기 때문에 필요합니다. 호출된 프로시저에서 처리되지 않은 오류가 발생하면 이 예외는 호출한 프로시저로 다시 전파되고, 호출에 이어지는 문에서 다시 실행됩니다. 이러한 경우에는 오류가 처리되지 않습니다.

Resume을 On Error 문 외부에서 독자적으로 사용할 수도 있습니다. Resume이 이 방식으로 사용된 경우 Visual Basic에서는 오류를 발생시킨 문으로 제어를 반환합니다. Resume 은 일반적으로 오류 처리기가 오류를 수정한 후에 사용합니다.

Visual Basic에서는 오류를 발생시킨 코드 줄 바로 다음 줄로 제어를 전달하는 ResumeNext 문도 제공합니다. 오류로 인해 응용 프로그램의 실행이 중지되는 경우가 아니라면 Resume Next을 사용할 수 있습니다. 또한 오류로 인해 서브루틴의 실행 결과가 예상과 다르게 나타나는 경우가 아니라면 역시 이 문을 사용할 수 있습니다.

Resume 문의 다른 형태로 On Error GoTo Line과 비슷한 Resume Line이 있습니다. Resume Line은 line 인수에서 지정한 줄로 제어를 전달합니다. Resume Line은 오류 처리기 내에서만 사용할 수 있습니다.

참고:

코드를 디버깅할 경우에는 On Error Resume Next 문을 비활성화해야 합니다.

On Error GoTo 0

On Error GoTo 0 문은 현재 프로시저의 모든 오류 처리기를 비활성화합니다. On Error GoTo 0 문을 사용하지 않으면 오류 처리기를 포함하는 프로시저가 끝나더라도 오류 처리기는 여전히 비활성화되어 있습니다.

참고:

On Error GoTo 0 문이 오류 처리 코드의 시작으로 0번 줄을 지정한다는 의미는 아닙니다. 이는 프로시저에 0번 줄이 있더라도 마찬가지입니다.

On Error GoTo -1

On Error GoTo -1 문은 현재 프로시저의 모든 예외 처리기를 비활성화합니다. On Error GoTo -1 문을 사용하지 않으면 프로시저 종료 시 예외가 자동으로 비활성화됩니다.

참고:

On Error GoTo -1 문이 오류 처리 코드의 시작으로 -1번 줄을 지정한다는 의미는 아닙니다. 이는 프로시저에 -1번 줄이 있더라도 마찬가지입니다.

비구조적 예외 처리기 예제

다음 코드에서 예외 처리기의 이름은 DivideByZero이며 0으로 나누려고 할 때 발생하는 특정 오류를 처리합니다. 다른 오류가 발생할 경우 Visual Basic에서는 런타임 오류를 발생시키고 응용 프로그램을 중지합니다.

Sub ErrorTest ()
' Declare variables.
   Dim x As Integer, y As Integer, z As Integer
   ' The exception handler is named "DivideByZero".
   On Error GoTo DivideByZero
   ' The main part of the code, which might cause an error.
   x = 2
   y = 0
   z = x \ y

   ' This line disables the exception handler.
   On Error GoTo 0
      Console.WriteLine(x & "/" & y & " = " & z)

   ' Exit the subroutine before the error-handling code.
   ' Failure to do so can create unexpected results.
   Exit Sub

   ' This is the exception handler, which deals with the error.
   DivideByZero:
   ' Include a friendly message to let the user know what is happening.
   Console.WriteLine("You have attempted to divide by zero!")

   ' Provide a solution to the error.
   y = 2

   ' The Resume statement returns to the point at which
   ' the error first occurred, so the application
   ' can continue to run.
   Resume

End Sub

참고 항목

작업

방법: Error 개체로부터 정보 검색

개념

비구조적 예외 처리의 Err 개체

예외 처리 소개

오류의 종류

구조적 및 비구조적 예외 처리를 사용하는 시기 선택

참조

End 문

Err 개체(Visual Basic)

Exit 문(Visual Basic)

On Error 문(Visual Basic)

Resume 문