On Error 문(Visual Basic)On Error Statement (Visual Basic)

오류 처리 루틴을 사용 하도록 설정 하 고 프로시저 내에서 루틴의 위치를 지정 합니다. 를 사용 하 여 오류 처리 루틴을 사용 하지 않도록 설정할 수도 있습니다.Enables an error-handling routine and specifies the location of the routine within a procedure; can also be used to disable an error-handling routine. On Error 문은 비구조적 오류 처리에 사용 되며 구조적 예외 처리 대신 사용할 수 있습니다.The On Error statement is used in unstructured error handling and can be used instead of structured exception handling. 구조적 예외 처리 는 .net에 기본 제공 되며, 일반적으로 더 효율적 이므로 응용 프로그램에서 런타임 오류를 처리할 때 권장 됩니다.Structured exception handling is built into .NET, is generally more efficient, and so is recommended when handling runtime errors in your application.

오류 처리 또는 예외 처리를 사용 하지 않을 경우 발생 하는 런타임 오류는 심각한 오류입니다. 오류 메시지가 표시 되 고 실행이 중지 됩니다.Without error handling or exception handling, any run-time error that occurs is fatal: an error message is displayed, and execution stops.

참고

키워드는 이전 버전과의 호환성을 위해 지원 되는 오류 문에서도 사용 됩니다. ErrorThe Error keyword is also used in the Error Statement, which is supported for backward compatibility.

구문Syntax

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

요소Parts

용어Term 정의Definition
GoToGoTo line 필요한 인수에 지정 된 줄에서 시작 하는 오류 처리 루틴을 사용 하도록 설정 합니다.Enables the error-handling routine that starts at the line specified in the required line argument. 인수는 줄 레이블이나 줄 번호입니다.The line argument is any line label or line number. 런타임 오류가 발생 하는 경우 지정 된 줄로 분기를 제어 하 여 오류 처리기를 활성화 합니다.If a run-time error occurs, control branches to the specified line, making the error handler active. 지정 된 줄은 On Error 문과 같은 프로시저에 있거나 컴파일 타임 오류가 발생 합니다.The specified line must be in the same procedure as the On Error statement or a compile-time error will occur.
GoTo 0 현재 프로시저에서 활성화 된 오류 처리기를 비활성화 하 고로 Nothing다시 설정 합니다.Disables enabled error handler in the current procedure and resets it to Nothing.
GoTo -1 현재 프로시저에서 활성화 된 예외를 비활성화 하 고로 Nothing다시 설정 합니다.Disables enabled exception in the current procedure and resets it to Nothing.
Resume Next 런타임 오류가 발생할 때 제어가 오류가 발생 한 문 바로 다음에 오는 문으로 이동 하 고 해당 지점에서 실행이 계속 되도록 지정 합니다.Specifies that when a run-time error occurs, control goes to the statement immediately following the statement where the error occurred, and execution continues from that point. 개체에 액세스할 On Error GoTo 때가 아닌이 폼을 사용 합니다.Use this form rather than On Error GoTo when accessing objects.

설명Remarks

참고

구조화 되지 않은 예외 처리 및 On Error 문을 사용 하는 대신 가능한 경우 코드에서 구조적 예외 처리를 사용 하는 것이 좋습니다.We recommend that you use structured exception handling in your code whenever possible, rather than using unstructured exception handling and the On Error statement. 자세한 내용은 Try...Catch...Finally 문을 참조하세요.For more information, see Try...Catch...Finally Statement.

"활성화 된" 오류 처리기는 On Error 문에 의해 설정 되는 오류 처리기입니다.An "enabled" error handler is one that is turned on by an On Error statement. "활성" 오류 처리기는 오류를 처리 하는 프로세스에 있는 활성화 된 처리기입니다.An "active" error handler is an enabled handler that is in the process of handling an error.

오류 처리기가 활성화 되어 있는 동안 오류가 발생 하는 경우 (오류 Resume발생과 Exit Function, Exit Sub, 또는 Exit Property 문 사이) 현재 프로시저의 오류 처리기에서 오류를 처리할 수 없습니다.If an error occurs while an error handler is active (between the occurrence of the error and a Resume, Exit Sub, Exit Function, or Exit Property statement), the current procedure's error handler cannot handle the error. 호출 하는 프로시저로 제어가 반환 됩니다.Control returns to the calling procedure.

호출 하는 프로시저에 활성화 된 오류 처리기가 있으면 오류를 처리 하도록 활성화 됩니다.If the calling procedure has an enabled error handler, it is activated to handle the error. 호출 하는 프로시저의 오류 처리기도 활성 상태인 경우에는 사용 되지만 비활성화 된 오류 처리기가 발견 될 때까지 이전 호출 프로시저를 통해 제어가 다시 전달 됩니다.If the calling procedure's error handler is also active, control passes back through previous calling procedures until an enabled, but inactive, error handler is found. 이러한 오류 처리기를 찾을 수 없는 경우 오류는 실제로 발생 한 지점에서 치명적입니다.If no such error handler is found, the error is fatal at the point at which it actually occurred.

오류 처리기가 호출 프로시저로 제어를 다시 전달할 때마다 해당 프로시저는 현재 프로시저가 됩니다.Each time the error handler passes control back to a calling procedure, that procedure becomes the current procedure. 프로시저의 오류 처리기에서 오류를 처리 한 후에는 Resume 문에 지정 된 지점에서 현재 프로시저의 실행이 다시 시작 됩니다.Once an error is handled by an error handler in any procedure, execution resumes in the current procedure at the point designated by the Resume statement.

참고

오류 처리 루틴은 Sub 프로시저 Function 또는 프로시저가 아닙니다.An error-handling routine is not a Sub procedure or a Function procedure. 줄 레이블이나 줄 번호로 표시 되는 코드 섹션입니다.It is a section of code marked by a line label or a line number.

Number 속성Number Property

오류 처리 루틴은 Number Err 개체의 속성 값을 사용 하 여 오류의 원인을 확인 합니다.Error-handling routines rely on the value in the Number property of the Err object to determine the cause of the error. 루틴은 다른 오류가 발생 하기 전이나 오류를 발생 시킬 Err 수 있는 프로시저를 호출 하기 전에 개체의 관련 속성 값을 테스트 하거나 저장 해야 합니다.The routine should test or save relevant property values in the Err object before any other error can occur or before a procedure that might cause an error is called. Err 개체의 속성 값에는 가장 최근의 오류만 반영 됩니다.The property values in the Err object reflect only the most recent error. Err.Number 관련 된 오류 메시지는에 Err.Description포함 되어 있습니다.The error message associated with Err.Number is contained in Err.Description.

Throw 문Throw Statement

Err.Raise 메서드에서 발생 하는 오류는 Exception 속성을 Exception 클래스의 새로 만든 인스턴스로 설정 합니다.An error that is raised with the Err.Raise method sets the Exception property to a newly created instance of the Exception class. 파생 된 예외 형식의 Throw 예외 발생을 지원 하기 위해 문은 언어로 지원 됩니다.In order to support the raising of exceptions of derived exception types, a Throw statement is supported in the language. 이는 throw 되는 예외 인스턴스인 단일 매개 변수를 사용 합니다.This takes a single parameter that is the exception instance to be thrown. 다음 예제에서는 기존 예외 처리 지원과 함께 이러한 기능을 사용할 수 있는 방법을 보여 줍니다.The following example shows how these features can be used with the existing exception handling support:

    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 문은 예외 클래스에 관계 없이 모든 오류를 트래핑 합니다.Notice that the On Error GoTo statement traps all errors, regardless of the exception class.

오류 다시 시작 다음On Error Resume Next

On Error Resume Next실행 시 오류가 발생 한 문 바로 다음에 오는 문을 실행 하거나 문을 포함 하 On Error Resume Next 는 프로시저에서 가장 최근의 호출 바로 다음에 오는 문으로 실행을 계속 합니다.On Error Resume Next causes execution to continue with the statement immediately following the statement that caused the run-time error, or with the statement immediately following the most recent call out of the procedure containing the On Error Resume Next statement. 이 문을 사용 하면 런타임 오류에도 불구 하 고 실행을 계속할 수 있습니다.This statement allows execution to continue despite a run-time error. 프로시저 내의 다른 위치로 제어를 전송 하는 대신 오류가 발생 하는 오류 처리 루틴을 저장할 수 있습니다.You can place the error-handling routine where the error would occur rather than transferring control to another location within the procedure. 다른 프로시저가 호출 될 때 On Error Resume Next 문이비활성화되므로해당루틴내에서인라인오류를처리하려는경우호출된각루틴에서문을실행해야합니다.On Error Resume NextAn On Error Resume Next statement becomes inactive when another procedure is called, so you should execute an On Error Resume Next statement in each called routine if you want inline error handling within that routine.

참고

합니다 On Error Resume Next 구문에 더 적합할 수 있습니다 On Error GoTo 다른 개체에 액세스 하는 동안 발생 한 오류를 처리 하는 경우.The On Error Resume Next construct may be preferable to On Error GoTo when handling errors generated during access to other objects. 개체 Err 와의 각 상호 작용 후에 확인 하면 코드에서 액세스 된 개체에 대 한 모호성을 제거 합니다.Checking Err after each interaction with an object removes ambiguity about which object was accessed by the code. 오류 코드 Err.Number를 배치 하는 개체와 원래 오류를 생성 한 개체 (에 Err.Source지정 된 개체)를 확인할 수 있습니다.You can be sure which object placed the error code in Err.Number, as well as which object originally generated the error (the object specified in Err.Source).

On Error GoTo 0On Error GoTo 0

On Error GoTo 0현재 프로시저에서 오류 처리를 사용 하지 않도록 설정 합니다.On Error GoTo 0 disables error handling in the current procedure. 오류 처리 코드의 시작으로 줄 0을 지정 하지 않습니다. 프로시저에 번호가 0 인 줄이 포함 된 경우에도 마찬가지입니다.It doesn't specify line 0 as the start of the error-handling code, even if the procedure contains a line numbered 0. On Error GoTo 0 문이 없으면 프로시저 종료 시 오류 처리기가 자동으로 비활성화 됩니다.Without an On Error GoTo 0 statement, an error handler is automatically disabled when a procedure is exited.

On Error GoTo-1On Error GoTo -1

On Error GoTo -1현재 프로시저에서 예외를 사용 하지 않도록 설정 합니다.On Error GoTo -1 disables the exception in the current procedure. 프로시저에-1로 번호가 지정 된 줄이 포함 된 경우에도 줄 1은 오류 처리 코드의 시작으로 지정 되지 않습니다.It does not specify line -1 as the start of the error-handling code, even if the procedure contains a line numbered -1. On Error GoTo -1 문이 없으면 프로시저를 종료할 때 예외가 자동으로 비활성화 됩니다.Without an On Error GoTo -1 statement, an exception is automatically disabled when a procedure is exited.

오류가 발생 하지 않은 경우 오류 처리 코드가 실행 되지 않도록 하려면 다음 조각과 같이 오류 Exit Sub처리 Exit Function루틴 바로 Exit Property 앞에, 또는 문을 추가 합니다.To prevent error-handling code from running when no error has occurred, place an Exit Sub, Exit Function, or Exit Property statement immediately before the error-handling routine, as in the following fragment:

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 문 앞에 프로시저 흐름과 구분 됩니다.Here, the error-handling code follows the Exit Sub statement and precedes the End Sub statement to separate it from the procedure flow. 프로시저의 아무 곳에 나 오류 처리 코드를 넣을 수 있습니다.You can place error-handling code anywhere in a procedure.

포착 되지 않은 오류Untrapped Errors

개체를 실행 파일로 실행 하는 경우 개체의 포착 되지 않은 오류는 제어 응용 프로그램으로 반환 됩니다.Untrapped errors in objects are returned to the controlling application when the object is running as an executable file. 개발 환경 내에서 적절 한 옵션이 설정 된 경우에만 포착 되지 않은 오류가 제어 응용 프로그램으로 반환 됩니다.Within the development environment, untrapped errors are returned to the controlling application only if the proper options are set. 디버깅 중에 설정 해야 하는 옵션에 대 한 설명, 설정 하는 방법 및 호스트가 클래스를 만들 수 있는지 여부는 호스트 응용 프로그램의 설명서를 참조 하세요.See your host application's documentation for a description of which options should be set during debugging, how to set them, and whether the host can create classes.

다른 개체에 액세스 하는 개체를 만드는 경우 다시 전달 되는 처리 되지 않은 오류를 처리 해야 합니다.If you create an object that accesses other objects, you should try to handle any unhandled errors they pass back. 사용할 수 없는 경우의 Err.Number 오류 코드를 고유한 오류 중 하나에 매핑한 다음 개체의 호출자에 게 다시 전달 합니다.If you cannot, map the error codes in Err.Number to one of your own errors and then pass them back to the caller of your object. VbObjectError 상수에 오류 코드를 추가 하 여 오류를 지정 해야 합니다.You should specify your error by adding your error code to the VbObjectError constant. 예를 들어 오류 코드가 1052 인 경우 다음과 같이 할당 합니다.For example, if your error code is 1052, assign it as follows:

Err.Number = vbObjectError + 1052

주의

Windows Dll (동적 연결 라이브러리)을 호출 하는 동안 발생 하는 시스템 오류는 예외를 발생 시 키 지 않으며 Visual Basic 오류 트래핑으로 트랩할 수 없습니다.System errors during calls to Windows dynamic-link libraries (DLLs) do not raise exceptions and cannot be trapped with Visual Basic error trapping. DLL 함수를 호출 하는 경우 각 반환 값에 성공 또는 실패 (API 사양에 따라)를 확인 하 고, 실패 시 Err 개체의 LastDLLError 속성에서 값을 확인 해야 합니다.When calling DLL functions, you should check each return value for success or failure (according to the API specifications), and in the event of a failure, check the value in the Err object's LastDLLError property.

예제Example

이 예에서는 먼저 On Error GoTo 문을 사용 하 여 프로시저 내에서 오류 처리 루틴의 위치를 지정 합니다.This example first uses the On Error GoTo statement to specify the location of an error-handling routine within a procedure. 이 예에서는 0으로 나누려고 시도 하면 오류 번호 6이 생성 됩니다.In the example, an attempt to divide by zero generates error number 6. 오류는 오류 처리 루틴에서 처리 되 고 컨트롤은 오류를 발생 시킨 문으로 반환 됩니다.The error is handled in the error-handling routine, and control is then returned to the statement that caused the error. On Error GoTo 0 문은 오류 트래핑을 해제 합니다.The On Error GoTo 0 statement turns off error trapping. 그런 다음 On Error Resume Next 문을 사용 하 여 다음 문에 의해 생성 된 오류에 대 한 컨텍스트를 특정에 대해 알 수 있도록 오류 트래핑을 지연 시킵니다.Then the On Error Resume Next statement is used to defer error trapping so that the context for the error generated by the next statement can be known for certain. 는 오류를 처리 한 후 Err 개체의 속성을 지우는 데 사용 됩니다.Err.ClearNote that Err.Clear is used to clear the Err object's properties after the error is handled.

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

요구 사항Requirements

네임스페이스: Microsoft.VisualBasicNamespace: Microsoft.VisualBasic

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

참고자료See also