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がスローされた例外を表します。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 の初期値は、スローされたエラーの値です。The initial value of exception is the value of the thrown error. 併用Catchキャッチ、エラーを指定します。Used with Catch to specify the error caught. 省略した場合は、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. ACatchステートメントをWhen句は例外をキャッチする場合にのみexpressionに評価されるTrueします。A Catch statement with a When clause catches exceptions only when expression evaluates to True. AWhen句は、例外の種類を確認後にのみ適用されると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. AFinallyブロックは常に実行がの一部を離れるときに実行、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.

ATry…Catchステートメントには、Tryブロックでは、1 つまたは複数続くCatch句で、さまざまな例外のハンドラーを指定します。A Try…Catch statement consists of a Try block followed by one or more Catch clauses, which specify handlers for various exceptions. 例外をスローするときに、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.

1 つ以上を使用することができます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 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. 前回通常これらのバリエーションの 1 つ使用する必要がありますCatchブロック、Try...Catch...Finally期待するすべての特定の例外をキャッチした後、構造体。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

  • ステートメントが noexception例については、変数。 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. 1 つ以上のブロックで変数を使用する場合は、外部変数を宣言、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). 詳細については、「Code Snippets」を参照してください。For more information, see Code Snippets.

Finally ブロックFinally block

1 つまたは複数のステートメントを終了する前に実行する必要がある場合、Try構造体を使用して、Finallyブロックします。If you have one or more statements that must run before you exit the Try structure, use a Finally block. 制御が移ります、Finallyブロックだけの out を渡す前に、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.

AFinallyブロックは、例外がある場合でも実行する必要がありますすべてのコードを実行しているに便利です。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ステートメントが少なくとも 1 つ含まれていないCatchブロックを含める必要があります、Finallyブロックします。If a Try statement does not contain at least one Catch block, it must contain a Finally block.

ヒント

場合は、特定の例外をキャッチする必要はありません、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:

  • 実行時に例外をキャッチすると、追加のオーバーヘッドを作成し、例外を回避するために事前に確認するよりも低下する可能性があります。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. これによってスローされる例外をキャッチする必要性が軽減、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

持つメソッドをマークする場合、 Async修飾子を使用できます、 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.

非同期のメソッドによって返されるタスクは、ハンドルされない例外が完了したことを示すエラーが発生した状態になる可能性があります。A task returned by an Async method may end in a faulted state, indicating that it completed due to an unhandled exception. タスクがその結果、取り消された状態になる可能性がありますも、 OperationCanceledException await 式からスローされます。A task may also end in a canceled state, which results in an OperationCanceledException being thrown out of the await expression. どちらの種類の例外をキャッチするには、配置、Await式内のタスクに関連付けられている、Tryで例外をキャッチして、ブロック、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. このようなタスクを待機して例外をキャッチしましたが、例外の 1 つだけどの例外がキャッチされるかを予測することはできません。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ステートメントを一度に 1 つのコレクションの各要素を返します。An iterator uses a Yield statement to return each element of the collection one at a time. 使用して反復子関数を呼び出すことをFor Each...Next ステートメントします。You call an iterator function by using a For Each...Next Statement.

YieldTryブロック内に置くことができます。A Yield statement can be inside a Try block. Yieldステートメントを含むTryブロックは、Catchブロックを持つことができ、そして、Finallyブロックを持つことができます。A Try block that contains a Yield statement can have Catch blocks, and can have a Finally block. 例については、Tryブロックの反復子を参照してください。See the "Try Blocks in Visual Basic" section of Iterators for an example.

AYield内でステートメントを使用できない、CatchブロックまたはFinallyブロックします。A Yield statement cannot be inside a Catch block or a Finally block.

場合、For Each本体 (関数の外側で、反復子)、例外がスロー、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. ACatch反復子関数の内側のブロックは、反復子関数内で発生する例外のみをキャッチします。A Catch block inside an iterator function catches only exceptions that occur inside the iterator function.

部分的に信頼された状況Partial-trust situations

ネットワーク共有でホストされるアプリケーションなど、部分的に信頼された状況でTry...Catch...Finally呼び出しを含むメソッドが呼び出される前に発生するセキュリティ例外をキャッチしません。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する前にそれをキャッチする、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

Try の構造をしています.キャッチしてください.最終的に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メソッドがスローされます、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

キャッチとステートメント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ブロックがある例外をスロー、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. 非同期タスクに適用される例外をキャッチする、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. 3 つのタスクと、タスクが完了Task.WhenAll適用が完了します。The task is complete when the three tasks to which Task.WhenAll is applied are complete.

3 つのタスクでそれぞれ例外が発生します。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