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

코드 블록에서 계속 코드를 실행 하는 동안 발생할 수 있는 일부 또는 모든 가능한 오류를 처리 하는 방법을 제공 합니다.Provides a way to handle some or all possible errors that may occur in a given block of code, while still running code.

구문Syntax

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

요소Parts

용어Term 정의Definition
tryStatements 선택 사항입니다.Optional. 오류가 발생할 수 있는 문.Statement(s) where an error can occur. 복합 문일 수 있습니다.Can be a compound statement.
Catch 선택 사항입니다.Optional. 여러 Catch 블록을 사용할 수 있습니다.Multiple Catch blocks permitted. 처리 하는 동안 예외가 발생 하는 경우는 Try 각 차단 Catch 문을 사용 하 여 예외를 처리 하는지 여부를 확인 하려면 텍스트 순서 대로 검사 exception throw 된 예외를 나타내는입니다.If an exception occurs when processing the Try block, each Catch statement is examined in textual order to determine whether it handles the exception, with exception representing the exception that has been thrown.
exception 선택 사항입니다.Optional. 임의의 변수 이름입니다.Any variable name. exception의 초기 값은 throw된 오류 값입니다.The initial value of exception is the value of the thrown error. 사용한 Catch 발생 한 예외를 지정 합니다.Used with Catch to specify the error caught. 생략 된 Catch 문은 예외를 catch 합니다.If omitted, the Catch statement catches any exception.
type 선택 사항입니다.Optional. 클래스 필터의 형식을 지정합니다.Specifies the type of class filter. 경우 값 exception 으로 지정 된 형식의 type 또는 파생 형식의 식별자가 예외 개체에 바인딩됩니다.If the value of exception is of the type specified by type or of a derived type, the identifier becomes bound to the exception object.
When 선택 사항입니다.Optional. A Catch 문을 사용 하 여는 When 절에서 예외를 catch 경우에만 expressionTrue합니다.A Catch statement with a When clause catches exceptions only when expression evaluates to True. A When 절이 예외 형식을 확인 한 다음에 적용 됩니다 및 expression 예외를 나타내는 식별자를 참조할 수 있습니다.A When clause is applied only after checking the type of the exception, and expression may refer to the identifier representing the exception.
expression 선택 사항입니다.Optional. 암시적으로 변환할 수 있어야 Boolean합니다.Must be implicitly convertible to Boolean. 일반 필터를 설명 하는 모든 식입니다.Any expression that describes a generic filter. 일반적으로 필터링 하는 데 오류 번호입니다.Typically used to filter by error number. 사용한 When 키워드는 오류가 발생 하는 상황을 지정 합니다.Used with When keyword to specify circumstances under which the error is caught.
catchStatements 선택 사항입니다.Optional. 연결에서 발생 하는 오류를 처리 하는 문 Try 블록입니다.Statement(s) to handle errors that occur in the associated Try block. 복합 문일 수 있습니다.Can be a compound statement.
Exit Try 선택 사항입니다.Optional. 밖으로 중단 되는 키워드는 Try...Catch...Finally 구조입니다.Keyword that breaks out of the Try...Catch...Finally structure. 바로 다음 코드를 사용 하 여 실행을 다시 시작을 End Try 문입니다.Execution resumes with the code immediately following the End Try statement. Finally 문을 계속 실행 됩니다.The Finally statement will still be executed. 에 사용할 수 없습니다 Finally 블록입니다.Not allowed in Finally blocks.
Finally 선택 사항입니다.Optional. A Finally 블록은 실행의 모든 부분을 벗어날 때 항상 실행을 Try...Catch 문.A Finally block is always executed when execution leaves any part of the Try...Catch statement.
finallyStatements 선택 사항입니다.Optional. 다른 모든 오류 처리를 수행한 후 실행 되는 문입니다.Statement(s) that are executed after all other error processing has occurred.
End Try 종료는 Try...Catch...Finally 구조입니다.Terminates the Try...Catch...Finally structure.

설명Remarks

특정 예외를 코드의 특정 섹션을 하는 동안 발생할 수는 예상 되는 경우에 코드를 입력 한 Try 차단 하 고 사용 하 여를 Catch 제어를 유지할 경우 예외를 처리 하는 블록.If you expect that a particular exception might occur during a particular section of code, put the code in a Try block and use a Catch block to retain control and handle the exception if it occurs.

A Try…Catch 문은 구성 됩니다는 Try 블록 뒤에 하나 이상의 Catch 다양 한 예외에 대 한 처리기를 지정 하는 절.A Try…Catch statement consists of a Try block followed by one or more Catch clauses, which specify handlers for various exceptions. 예외가 throw 되는 경우는 Try 차단, Visual Basic 찾습니다는 Catch 예외를 처리 하는 문입니다.When an exception is thrown in a Try block, Visual Basic looks for the Catch statement that handles the exception. 일치 하는 경우 Catch 문을 찾을 수 없습니다, Visual Basic 호출 스택 위로 등 현재 메서드를 호출 하는 메서드를 검사 합니다.If a matching Catch statement is not found, Visual Basic examines the method that called the current method, and so on up the call stack. 없으면 Catch 블록이 발견, Visual Basic 처리 되지 않은 예외 메시지가 사용자에 게 표시 하 고 프로그램의 실행을 중지 합니다.If no Catch block is found, Visual Basic displays an unhandled exception message to the user and stops execution of the program.

둘 이상 사용할 수 있습니다 Catch 문에서 Try…Catch 문입니다.You can use more than one Catch statement in a Try…Catch statement. 이 순서는 Catch 절 순서 대로 검사 되므로 유효 합니다.If you do this, the order of the Catch clauses is significant because they are examined in order. 더 구체적인 예외를 덜 구체적인 예외보다 먼저 catch합니다.Catch the more specific exceptions before the less specific ones.

다음 Catch 문 조건은 가장 덜 구체적인 하며 모든 뒤쳐지면에서 파생 되는 예외는 Exception 클래스입니다.The following Catch statement conditions are the least specific, and will catch all exceptions that derive from the Exception class. 마지막으로 이러한 종류의 일반적으로 사용 해야 Catch 블록을 Try...Catch...Finally 원하는 모든 특정 예외를 catch 한 후 구조입니다.You should ordinarily use one of these variations as the last Catch block in the Try...Catch...Finally structure, after catching all the specific exceptions you expect. 제어 흐름에 절대로 도달할 수는 Catch 이러한 변형이 하나 뒤에 오는 블록입니다.Control flow can never reach a Catch block that follows either of these variations.

  • 합니다 typeException예를 들어: Catch ex As ExceptionThe type is Exception, for example: Catch ex As Exception

  • 문이 아무런 exception 예를 들어 변수: CatchThe statement has no exception variable, for example: Catch

경우는 Try…Catch…Finally 다른 문이 중첩 되 Try 블록, Visual Basic에 각 항목을 먼저 검사 Catch 문은 가장 안쪽에서 Try 블록입니다.When a Try…Catch…Finally statement is nested in another Try block, Visual Basic first examines each Catch statement in the innermost Try block. 일치 하는 경우 Catch 문이 있으면, 검색을 진행 합니다 Catch 문 외부의 Try…Catch…Finally 블록.If no matching Catch statement is found, the search proceeds to the Catch statements of the outer Try…Catch…Finally block.

로컬 변수를 Try 블록에서 사용할 수 없는 Catch 별도 요소 이기 때문에 차단 합니다.Local variables from a Try block are not available in a Catch block because they are separate blocks. 둘 이상의 블록에서 변수를 사용 하려는 경우 외부 변수를 선언 합니다 Try...Catch...Finally 구조입니다.If you want to use a variable in more than one block, declare the variable outside the Try...Catch...Finally structure.

Try…Catch…Finally 문을 IntelliSense 코드 조각으로 사용할 수는 있습니다.The Try…Catch…Finally statement is available as an IntelliSense code snippet. 코드 조각 관리자에서 확장 코드 패턴-If, For Each, Try Catch, 속성 등를 차례로 오류 처리 (예외) 합니다.In the Code Snippets Manager, expand Code Patterns - If, For Each, Try Catch, Property, etc, and then Error Handling (Exceptions). 자세한 내용은 코드 조각을 참조하세요.For more information, see Code Snippets.

Finally 블록Finally block

종료 하기 전에 실행 해야 하는 하나 이상의 문이 있는 경우는 Try 구조체를 사용 하 여를 Finally 블록입니다.If you have one or more statements that must run before you exit the Try structure, use a Finally block. 컨트롤을 전달 합니다 Finally 블록 밖으로 전달 하기 직전는 Try…Catch 구조입니다.Control passes to the Finally block just before it passes out of the Try…Catch structure. 내에서 예외가 발생 하는 경우에 마찬가지 여 Try 구조입니다.This is true even if an exception occurs anywhere inside the Try structure.

Finally 블록은 예외가 발생 하는 경우에 실행 해야 하는 모든 코드를 실행 한 경우에 유용 합니다.A Finally block is useful for running any code that must execute even if there is an exception. 컨트롤에 전달 되는 Finally 블록에 관계 없이 Try...Catch 종료를 차단 합니다.Control is passed to the Finally block regardless of how the Try...Catch block exits.

코드를 Finally 코드에서 발견 하는 경우에 블록이 실행을 Return 문에서 Try 또는 Catch 블록.The code in a Finally block runs even if your code encounters a Return statement in a Try or Catch block. 컨트롤에서 전달 하지 않습니다는 Try 또는 Catch 블록에서 해당 Finally 다음과 같은 경우 차단 합니다.Control does not pass from a Try or Catch block to the corresponding Finally block in the following cases:

에 실행을 명시적으로 전송할 올바르지는 Finally 블록입니다.It is not valid to explicitly transfer execution into a Finally block. 전송의 실행을 Finally 블록이 예외 사항을 제외 하 고 잘못 되었습니다.Transferring execution out of a Finally block is not valid, except through an exception.

경우는 Try 문을 하나 이상 포함 하지 않는 Catch 블록을 포함 해야 합니다는 Finally 블록입니다.If a Try statement does not contain at least one Catch block, it must contain a Finally block.

특정 예외를 catch 하지 않은 경우는 Using 문 처럼는 Try…Finally 블록과 블록을 종료 하는 방법에 관계 없이 리소스를 삭제할 수 있습니다.If you do not have to catch specific exceptions, the Using statement behaves like a Try…Finally block, and guarantees disposal of the resources, regardless of how you exit the block. 처리 되지 않은 예외를 사용 하 여도 마찬가지입니다.This is true even with an unhandled exception. 자세한 내용은 using 문을 참조하세요.For more information, see Using Statement.

예외 인수Exception argument

Catch 블록 exception 인수가의 인스턴스를 Exception 클래스 또는 클래스에서 파생 되는 Exception 클래스입니다.The Catch block exception argument is an instance of the Exception class or a class that derives from the Exception class. 합니다 Exception 에서 발생 한 오류에 해당 하는 클래스 인스턴스는 Try 블록입니다.The Exception class instance corresponds to the error that occurred in the Try block.

속성을 Exception 개체 원인과 예외가 위치의 하는 데 도움이 됩니다.The properties of the Exception object help to identify the cause and location of an exception. 예를 들어를 StackTrace 속성 오류 코드에서 발생 하는 위치를 찾을 수 있도록 예외를 발생 시킨 호출된 메서드를 보여 줍니다.For example, the StackTrace property lists the called methods that led to the exception, helping you find where the error occurred in the code. Message 예외를 설명 하는 메시지를 반환 합니다.Message returns a message that describes the exception. HelpLink 연결된 된 도움말 파일에 대 한 링크를 반환합니다.HelpLink returns a link to an associated Help file. InnerException 반환 합니다 Exception 현재 예외를 발생 시킨 개체를 반환 합니다 Nothing 원본 있으면 Exception합니다.InnerException returns the Exception object that caused the current exception, or it returns Nothing if there is no original Exception.

Try 사용 시 고려 사항 중... Catch 문Considerations when using a Try…Catch statement

사용 하 여를 Try…Catch 만 발생을 알리는 비정상적인 또는 예기치 않은 프로그램 이벤트는 문입니다.Use a Try…Catch statement only to signal the occurrence of unusual or unanticipated program events. 이 문제의 원인은 다음과 같습니다.Reasons for this include the following:

  • 런타임 시 예외를 catch 추가 오버 헤드를 만들고 예외를 방지 하기 위해 미리 확인 하는 보다 느려질 가능성이 있습니다.Catching exceptions at runtime creates additional overhead, and is likely to be slower than pre-checking to avoid exceptions.

  • 경우는 Catch 블록을 올바르게 처리 하지 않으면, 사용자에 게 예외를 올바르게 보고 되지 않을 수 있습니다.If a Catch block is not handled correctly, the exception might not be reported correctly to users.

  • 예외 처리를 사용 하면 프로그램이 더 복잡 합니다.Exception handling makes a program more complex.

항상 필요 하지 않습니다는 Try…Catch 발생할 가능성이 있는 조건을 확인 하는 문이 있습니다.You do not always need a Try…Catch statement to check for a condition that is likely to occur. 다음 예제에서는 파일을 열기 전에 있는지 확인 합니다.The following example checks whether a file exists before trying to open it. throw 된 예외를 catch 하는 것에 대 한 필요를 줄여이 OpenText 메서드.This reduces the need for catching an exception thrown by the OpenText method.

Private Sub TextFileExample(ByVal filePath As String)

    ' Verify that the file exists.
    If System.IO.File.Exists(filePath) = False Then
        Console.Write("File Not Found: " & filePath)
    Else
        ' Open the text file and display its contents.
        Dim sr As System.IO.StreamReader =
            System.IO.File.OpenText(filePath)

        Console.Write(sr.ReadToEnd)

        sr.Close()
    End If
End Sub

해당 코드를 확인 Catch 블록 스레드로부터 안전한 로깅 또는 적절 한 메시지 통해 사용자에 게 예외를 올바르게 보고할 수 있습니다.Ensure that code in Catch blocks can properly report exceptions to users, whether through thread-safe logging or appropriate messages. 그렇지 않으면 예외는 알 수 없는 남아 있을 수 있습니다.Otherwise, exceptions might remain unknown.

비동기 메서드Async methods

메서드를 사용 하 여 표시 하는 경우는 비동기 한정자를 사용할 수는 Await 메서드에서 연산자입니다.If you mark a method with the Async modifier, you can use the Await operator in the method. 사용 하 여 문을 여 Await 연산자는 대기 중인된 작업이 완료 될 때까지 메서드의 실행을 일시 중단 합니다.A statement with the Await operator suspends execution of the method until the awaited task completes. 작업은 진행 중인 작업을 나타냅니다.The task represents ongoing work. 경우 연관 된 태스크는 Await 연산자 완료 되 면 동일한 메서드에서 실행 다시 시작 합니다.When the task that's associated with the Await operator finishes, execution resumes in the same method. 자세한 내용은 비동기 프로그램의 제어 흐름합니다.For more information, see Control Flow in Async Programs.

비동기 메서드에서 반환 하는 작업 처리 되지 않은 예외로 인해 완료 되었는지 나타내는 faulted 상태의 종료 될 수 있습니다.A task returned by an Async method may end in a faulted state, indicating that it completed due to an unhandled exception. 취소 된 상태로 작업을 종료할 수 있습니다는 OperationCanceledException await 식에서 throw 됩니다.A task may also end in a canceled state, which results in an OperationCanceledException being thrown out of the await expression. 두 가지 형식의 예외를 catch 하려면 배치 합니다 Await 식에서 해당 작업을 연관 된를 Try 블록 및 예외를 catch를 Catch 블록.To catch either type of exception, place the Await expression that's associated with the task in a Try block, and catch the exception in the Catch block. 예제는이 항목의 뒷부분에 제공 됩니다.An example is provided later in this topic.

여러 예외가 해당 오류에 대 한 책임 되었기 때문에 작업을 faulted 상태로 될 수 있습니다.A task can be in a faulted state because multiple exceptions were responsible for its faulting. 예를 들어 작업은 Task.WhenAll 호출의 결과일 수 있습니다.For example, the task might be the result of a call to Task.WhenAll. 이러한 작업을 기다릴 때 예외가 예외 중 하나만 이며 예외를 포착는 예측할 수 없습니다.When you await such a task, the caught exception is only one of the exceptions, and you can't predict which exception will be caught. 예제는이 항목의 뒷부분에 제공 됩니다.An example is provided later in this topic.

Await 식 내에 있을 수 없습니다.을 Catch 블록 또는 Finally 블록입니다.An Await expression can't be inside a Catch block or Finally block.

반복기Iterators

반복기 함수 또는 Get 접근자 컬렉션 사용자 지정 반복을 수행 합니다.An iterator function or Get accessor performs a custom iteration over a collection. 반복기를 사용 하는 Yield 문을 한 번에 하나씩 컬렉션의 각 요소를 반환 합니다.An iterator uses a Yield statement to return each element of the collection one at a time. 반복기 함수를 사용 하 여 호출을 각각에 대 한 중... 다음 문을합니다.You call an iterator function by using a For Each...Next Statement.

A Yield 문 내에 있을 수는 Try 블록입니다.A Yield statement can be inside a Try block. A Try 포함 된 블록을 Yield 문의 Catch 블록을 가질 수 있습니다를 Finally 블록.A Try block that contains a Yield statement can have Catch blocks, and can have a Finally block. "Visual Basic에서 시도 블록" 섹션을 참조 하세요 반복기 예입니다.See the "Try Blocks in Visual Basic" section of Iterators for an example.

A Yield 문 내에 있을 수 없습니다.을 Catch 블록 또는 Finally 블록입니다.A Yield statement cannot be inside a Catch block or a Finally block.

경우는 For Each 본문 (반복기 함수) 외부에서 예외를 throw를 Catch 반복기 함수에는 블록이 실행 되지 않습니다 하지만 Finally 반복기 함수에는 블록이 실행 됩니다.If the For Each body (outside of the iterator function) throws an exception, a Catch block in the iterator function is not executed, but a Finally block in the iterator function is executed. Catch 블록은 반복기 함수 내에서 반복기 함수 내에서 발생 하는 예외만 catch 합니다.A Catch block inside an iterator function catches only exceptions that occur inside the iterator function.

부분 신뢰 상태Partial-trust situations

네트워크 공유에 호스트 된 응용 프로그램 같은 부분 신뢰 상황에서는 Try...Catch...Finally 호출을 포함 하는 메서드를 호출 하기 전에 발생 하는 보안 예외를 catch 하지 않습니다.In partial-trust situations, such as an application hosted on a network share, Try...Catch...Finally does not catch security exceptions that occur before the method that contains the call is invoked. 다음 예제에서는 서버 공유에 배치 하 고 여기에서 실행할 때 오류가 발생 합니다 "System.Security.SecurityException: 요청이 실패 했습니다. "The following example, when you put it on a server share and run from there, produces the error "System.Security.SecurityException: Request Failed." 보안 예외에 대 한 자세한 내용은 참조는 SecurityException 클래스입니다.For more information about security exceptions, see the SecurityException class.

Try
    Process.Start("http://www.microsoft.com")
Catch ex As Exception
    MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try

이러한 부분 신뢰 상황에서 배치 해야 합니다 Process.Start 문을 별도의 Sub합니다.In such a partial-trust situation, you have to put the Process.Start statement in a separate Sub. 처음 호출 된 Sub 실패 합니다.The initial call to the Sub will fail. 이 통해 Try...Catch 하기 전에 catch 할 수는 Sub 포함 하는 Process.Start 시작 보안 예외를 생성 합니다.This enables Try...Catch to catch it before the Sub that contains Process.Start is started and the security exception produced.

예제Examples

시도의 구조는 중... Catch 하는 중... 마지막으로The structure of Try...Catch...Finally

다음 예제에서는의 구조를 보여 줍니다.는 Try...Catch...Finally 문입니다.The following example illustrates the structure of the Try...Catch...Finally statement.

Public Sub TryExample()
    ' Declare variables.
    Dim x As Integer = 5
    Dim y As Integer = 0

    ' Set up structured error handling.
    Try
        ' Cause a "Divide by Zero" exception.
        x = x \ y

        ' This statement does not execute because program
        ' control passes to the Catch block when the
        ' exception occurs.
        MessageBox.Show("end of Try block")
    Catch ex As Exception
        ' Show the exception's message.
        MessageBox.Show(ex.Message)

        ' Show the stack trace, which is a list of methods
        ' that are currently executing.
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Finally
        ' This line executes whether or not the exception occurs.
        MessageBox.Show("in Finally block")
    End Try
End Sub

Try 블록에서 호출 된 메서드 예외Exception in a method called from a Try block

다음 예제에서는 CreateException 메서드가 throw를 NullReferenceException입니다.In the following example, the CreateException method throws a NullReferenceException. 예외를 생성 하는 코드에 없는 경우는 Try 블록입니다.The code that generates the exception is not in a Try block. 따라서는 CreateException 메서드는 예외를 처리 하지 않습니다.Therefore, the CreateException method does not handle the exception. 합니다 RunSample 때문에 메서드는 예외를 처리에 대 한 호출을 CreateException 메서드는을 Try 블록.The RunSample method does handle the exception because the call to the CreateException method is in a Try block.

예제에 포함 되어 Catch 에서 정렬 된 여러 유형의 예외에 대 한 문을 가장 일반적인 가장 구체적인 합니다.The example includes Catch statements for several types of exceptions, ordered from the most specific to the most general.

Public Sub RunSample()
    Try
        CreateException()
    Catch ex As System.IO.IOException
        ' Code that reacts to IOException.
    Catch ex As NullReferenceException
        MessageBox.Show("NullReferenceException: " & ex.Message)
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Catch ex As Exception
        ' Code that reacts to any other exception.
    End Try
End Sub

Private Sub CreateException()
    ' This code throws a NullReferenceException.
    Dim obj = Nothing
    Dim prop = obj.Name

    ' This code also throws a NullReferenceException.
    'Throw New NullReferenceException("Something happened.")
End Sub

때 Catch 문The Catch When statement

다음 예제에서는 사용 하는 방법을 보여 줍니다는 Catch When 조건식에서 필터링 하기 위해.The following example shows how to use a Catch When statement to filter on a conditional expression. 로 평가 되 면 조건식 True의 코드는 Catch 블록이 실행 됩니다.If the conditional expression evaluates to True, the code in the Catch block runs.

Private Sub WhenExample()
    Dim i As Integer = 5

    Try
        Throw New ArgumentException()
    Catch e As OverflowException When i = 5
        Console.WriteLine("First handler")
    Catch e As ArgumentException When i = 4
        Console.WriteLine("Second handler")
    Catch When i = 5
        Console.WriteLine("Third handler")
    End Try
End Sub
' Output: Third handler

중첩 된 Try 문Nested Try statements

다음 예제에는 Try…Catch 에 포함 된 문에 Try 블록입니다.The following example has a Try…Catch statement that is contained in a Try block. 내부 Catch 블록에는 예외가 throw 됩니다. 해당 InnerException 속성이 원래 예외를 설정 합니다.The inner Catch block throws an exception that has its InnerException property set to the original exception. 외부 Catch 블록 자체 예외 및 내부 예외를 보고 합니다.The outer Catch block reports its own exception and the inner exception.

Private Sub InnerExceptionExample()
    Try
        Try
            ' Set a reference to a StringBuilder.
            ' The exception below does not occur if the commented
            ' out statement is used instead.
            Dim sb As System.Text.StringBuilder
            'Dim sb As New System.Text.StringBuilder

            ' Cause a NullReferenceException.
            sb.Append("text")
        Catch ex As Exception
            ' Throw a new exception that has the inner exception
            ' set to the original exception.
            Throw New ApplicationException("Something happened :(", ex)
        End Try
    Catch ex2 As Exception
        ' Show the exception.
        Console.WriteLine("Exception: " & ex2.Message)
        Console.WriteLine(ex2.StackTrace)

        ' Show the inner exception, if one is present.
        If ex2.InnerException IsNot Nothing Then
            Console.WriteLine("Inner Exception: " & ex2.InnerException.Message)
            Console.WriteLine(ex2.StackTrace)
        End If
    End Try
End Sub

비동기 메서드에 대 한 예외 처리Exception handling for async methods

다음 예제에서는 비동기 메서드에 대한 예외 처리를 보여 줍니다.The following example illustrates exception handling for async methods. 비동기 작업에 적용 되는 예외를 catch 하는 Await 식에는 Try 호출자 및 예외 블록에서 포착 되는 Catch 블록.To catch an exception that applies to an async task, the Await expression is in a Try block of the caller, and the exception is caught in the Catch block.

예제에서 Throw New Exception 줄의 주석 처리를 제거하여 예외 처리를 보여 줍니다.Uncomment the Throw New Exception line in the example to demonstrate exception handling. 예외에 들어갈는 Catch 작업의 블록 IsFaulted 속성이로 설정 되어 True, 및 태스크의 Exception.InnerException 예외 속성.The exception is caught in the Catch block, the task's IsFaulted property is set to True, and the task's Exception.InnerException property is set to the exception.

Throw New OperationCancelledException 줄의 주석 처리를 제거하여 비동기 프로세스를 취소할 수 있을 때 발생하는 동작을 보여 줍니다.Uncomment the Throw New OperationCancelledException line to demonstrate what happens when you cancel an asynchronous process. 예외에서 발견 되는 Catch 블록과 작업의 IsCanceled 속성이 True합니다.The exception is caught in the Catch block, and the task's IsCanceled property is set to True. 그러나이 예에는 적용 되지 않는 몇몇 조건 IsFaulted 로 설정 된 TrueIsCanceled 로 설정 된 False합니다.However, under some conditions that don't apply to this example, IsFaulted is set to True and IsCanceled is set to False.

Public Async Function DoSomethingAsync() As Task
    Dim theTask As Task(Of String) = DelayAsync()

    Try
        Dim result As String = Await theTask
        Debug.WriteLine("Result: " & result)
    Catch ex As Exception
        Debug.WriteLine("Exception Message: " & ex.Message)
    End Try

    Debug.WriteLine("Task IsCanceled: " & theTask.IsCanceled)
    Debug.WriteLine("Task IsFaulted:  " & theTask.IsFaulted)
    If theTask.Exception IsNot Nothing Then
        Debug.WriteLine("Task Exception Message: " &
            theTask.Exception.Message)
        Debug.WriteLine("Task Inner Exception Message: " &
            theTask.Exception.InnerException.Message)
    End If
End Function

Private Async Function DelayAsync() As Task(Of String)
    Await Task.Delay(100)

    ' Uncomment each of the following lines to
    ' demonstrate exception handling.

    'Throw New OperationCanceledException("canceled")
    'Throw New Exception("Something happened.")
    Return "Done"
End Function


' Output when no exception is thrown in the awaited method:
'   Result: Done
'   Task IsCanceled: False
'   Task IsFaulted:  False

' Output when an Exception is thrown in the awaited method:
'   Exception Message: Something happened.
'   Task IsCanceled: False
'   Task IsFaulted:  True
'   Task Exception Message: One or more errors occurred.
'   Task Inner Exception Message: Something happened.

' Output when an OperationCanceledException or TaskCanceledException
' is thrown in the awaited method:
'   Exception Message: canceled
'   Task IsCanceled: True
'   Task IsFaulted:  False

비동기 메서드에서 여러 예외 처리Handling multiple exceptions in async methods

다음 예제에서는 여러 작업에서 여러 예외가 발생할 수 있는 경우 예외 처리를 보여 줍니다.The following example illustrates exception handling where multiple tasks can result in multiple exceptions. 합니다 Try 블록에는 Await 작업에 대 한 식을 Task.WhenAll 반환 합니다.The Try block has the Await expression for the task that Task.WhenAll returned. 세 개의 작업 태스크가 완료 되 Task.WhenAll 적용 완료 됩니다.The task is complete when the three tasks to which Task.WhenAll is applied are complete.

세 작업에서 각각 예외가 발생합니다.Each of the three tasks causes an exception. 합니다 Catch 블록에 있는 예외를 반복 합니다 Exception.InnerExceptions 태스크의 속성은 Task.WhenAll 반환 합니다.The Catch block iterates through the exceptions, which are found in the Exception.InnerExceptions property of the task that Task.WhenAll returned.

Public Async Function DoMultipleAsync() As Task
    Dim theTask1 As Task = ExcAsync(info:="First Task")
    Dim theTask2 As Task = ExcAsync(info:="Second Task")
    Dim theTask3 As Task = ExcAsync(info:="Third Task")

    Dim allTasks As Task = Task.WhenAll(theTask1, theTask2, theTask3)

    Try
        Await allTasks
    Catch ex As Exception
        Debug.WriteLine("Exception: " & ex.Message)
        Debug.WriteLine("Task IsFaulted: " & allTasks.IsFaulted)
        For Each inEx In allTasks.Exception.InnerExceptions
            Debug.WriteLine("Task Inner Exception: " + inEx.Message)
        Next
    End Try
End Function

Private Async Function ExcAsync(info As String) As Task
    Await Task.Delay(100)

    Throw New Exception("Error-" & info)
End Function

' Output:
'   Exception: Error-First Task
'   Task IsFaulted: True
'   Task Inner Exception: Error-First Task
'   Task Inner Exception: Error-Second Task
'   Task Inner Exception: Error-Third Task

참고자료See also