Visual Basic 2005 または Visual Basic .NET で例外をキャッチする方法

Microsoft Visual C# 2005 または Microsoft Visual C# .NET については、次の資料を参照してください。308345

Microsoft Visual Basic 6.0 については、次の資料を参照してください。191474

概要

例外のキャッチと処理は、プログラミングでの標準的な作業です。この資料では、try-catch-finally ブロックを使用して例外をキャッチする方法について説明します。try-catch-finally ブロックは、例外が発生する可能性がある任意のコードを囲む "ラッパー" です。



try-catch-finally ブロックは以下の部分で構成されます。

  • 例外をスローする可能性があるコードをすべて try ブロックの内部に配置します。

  • 例外がスローされた場合、catch ブロックに入り、プログラムで適切な回復操作を実行したり、ユーザーに警告したりすることができます。

  • finally ブロックのコードは常に実行され、例外の発生後クリーンアップを実行できます。finally ブロックは省略可能です。

必要条件

推奨する必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack は、次のとおりです。

  • Microsoft Windows Server 2003、Microsoft Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、または Microsoft Windows NT 4.0 Server
  • Microsoft Visual Basic 2005 または Microsoft Visual Basic .NET

手順の例

  1. Visual Basic .NET または Visual Basic 2005 でコンソール アプリケーションを新規作成します。

  2. Sub Main プロシージャに、以下のようなコード サンプルを挿入します。このサンプルでは 3 つの変数の宣言と初期化を行っており、このうち "k" の初期化でエラーが発生します。

    ' This code generates an exception.
    Console.WriteLine("We're going to divide 10 by 0 and see what happens...")
    Console.WriteLine()

    Dim i as Integer = 10
    Dim j as Integer = 0
    Dim k As Integer = i/j ' Error on this line.
  3. F5 キーを押して例外を表示します。

  4. try-catch ステートメントでコードを囲み、エラーをキャプチャします。次のコードでは、コード内でスローされるエラーをすべてキャッチし、一般的なエラー メッセージを表示します。Sub Main プロシージャのコードを次のコードに置き換えます。

    ' This code shows how to catch an exception.
    Try
    Console.WriteLine("We're going to divide 10 by 0 and see what happens...")
    Console.WriteLine()

    Dim i as Integer = 10
    Dim j as Integer = 0
    Dim k As Integer = i/j ' Error on this line. Control jumps to the catch block.
    Catch
    Console.WriteLine("An error occurred.")
    End Try
  5. Ctrl + F5 キーを押してプロジェクトを実行します。catch ブロックにあるエラー メッセージが表示されることを確認してください。

  6. エラーの有無にかかわらずクリーンアップや後処理が必要な場合は、try-catch-finally ステートメントの finally 部分を使用します。このステートメントの finally 部分のコードは、例外の有無にかかわらず必ず実行されます。次のコードにより、エラーが発生しない場合でも、コンソールに "This statement is always printed" と表示されます。Sub Main のコードを次のコードに置き換えてください。

    ' This code shows how to catch an exception.
    Try
    Console.WriteLine("We're going to divide 10 by 0 and see what happens...")
    Console.WriteLine()

    Dim i as Integer = 10
    Dim j as Integer = 0
    Dim k As Integer = i/j ' Error on this line. Control jumps to the catch block.

    Catch
    Console.WriteLine("An error occurred.")
    Finally ' This section is performed regardless of the above processing.
    Console.WriteLine()
    Console.WriteLine("This statement is always printed")
    End Try
  7. Ctrl + F5 キーを押してプロジェクトを実行します。

  8. catch ステートメントを持つ例外オブジェクトを使用して、例外の詳細情報を取得できます。例外には、ヘルプ、ソース、または例外に関するスタック情報の識別に役立てられるプロパティが多数含まれています。この情報は、例外の最初の原因を追跡したり、その例外の発生元の詳しい説明を提供したりするのに非常に有用な場合があります。以下のサンプルでは例外をキャッチし、指定したエラー メッセージを表示します。先ほどと同様、Sub Main プロシージャのコードを以下のコードに置き換えてください。



    例 1
    ' This code shows how to catch an exception.
    Try
    Console.WriteLine("We're going to divide 10 by 0 and see what happens...")
    Console.WriteLine()

    Dim i as Integer = 10
    Dim j as Integer = 0
    Dim k As Integer = i/j ' Error on this line. Control jumps to the catch block.

    Catch e As Exception ' Perform code that deals with the exception
    ' or informs the user what occurred.
    Console.WriteLine("The following error occurred:")
    Console.WriteLine(e.ToString()) ' Print the error message to the user.

    Finally ' This section is performed regardless of the above processing.
    Console.WriteLine()
    Console.WriteLine("This statement is always printed")
    End Try
    例 2
    ' This code shows how to catch an exception.
    Try
    Console.WriteLine("We're going to divide 10 by 0 and see what happens...")
    Console.WriteLine()

    Dim i as Integer = 10
    Dim j as Integer = 0
    Dim k As Integer = i/j ' Error on this line. Control jumps to the catch block.

    Catch e As Exception ' Perform code that deals with the exception
    ' or informs the user what occurred.
    Console.WriteLine("The following error occurred:")
    Console.WriteLine( e.Message ) ' Print the error message.
    Console.WriteLine( e.Source ) ' Name of application or object
    ' that caused the error
    Console.WriteLine( e.StackTrace ) ' String that contains the stack
    ' trace for this exception
    Finally ' This section is performed regardless of the above processing.
    Console.WriteLine()
    Console.WriteLine("This statement is always printed")
    End Try
  9. ここまでは、不特定の例外の個別のケースに対処してきました。しかし、発生する例外の種類があらかじめわかっている場合は、予期される例外をキャッチして、それに応じた処理を行うことができます。その後、複数の Catch ブロックを使用することで、他のすべての例外をキャッチして処理することもできます。次のサンプルで例示します。

    Module Module1
    Sub Main()

    ' Attempt to do some file processing.
    ' This can cause a number of potential exceptions.
    ' Note that you can use the specific exceptions to get extra information about that exception,
    ' but this example focuses on showing control execution for those exceptions.

    Try
    File.Create("c:/temp/test.txt") ' Can fail for a number of reasons

    Catch ioe As System.IO.IOException ' This error may occur if the Temp folder does not exist.
    Console.WriteLine("An IO error occurred. The c:\temp folder does not exist")

    Catch se As System.Security.SecurityException ' You do not have the appropriate permission
    ' to take this action.
    Console.WriteLine("You don't have the security permissions to take this action!")

    Catch e As Exception ' Catch all other exceptions.
    Console.WriteLine( e.ToString() ) ' Print the standard exception information.
    End Try
    End Sub
    End Module
    コンピュータの構成の違いにより、この手順のサンプルで例外がスローされる場合とされない場合があります。強制的に入出力の例外を起こす場合は、ファイル パスをコンピュータに存在しないフォルダに変更します。

関連情報

詳細については、Microsoft .NET Framework SDK (Software Development Kit) を参照してください。

プロパティ

文書番号:301283 - 最終更新日: 2006/12/21 - リビジョン: 1

フィードバック