Try ブロックと Catch ブロックを使用して例外をキャッチする方法How to use the try/catch block to catch exceptions

例外を発生またはスローする可能性のあるコード ステートメントはいずれも try ブロックに配置し、1 つまたは複数の例外を処理するのに使用されるステートメントは catch ブロックの下にある 1 つまたは複数の try ブロックに配置します。Place any code statements that might raise or throw an exception in a try block, and place statements used to handle the exception or exceptions in one or more catch blocks below the try block. catch ブロックには例外の種類が含まれており、その例外の種類を処理するのに必要なステートメントを追加で含めることができます。Each catch block includes the exception type and can contain additional statements needed to handle that exception type.

次の例では、StreamReader を使用して、data.txt と呼ばれるファイルを開き、そのファイルから行を取得します。In the following example, a StreamReader opens a file called data.txt and retrieves a line from the file. コードからは 3 つの例外のいずれかがスローされる可能性があります。そのため、コードは try ブロックに配置します。Since the code might throw any of three exceptions, it's placed in a try block. 3 つの catch ブロックでは例外がキャッチされます。さらに結果をコンソールに表示してそれらの例外が処理されます。Three catch blocks catch the exceptions and handle them by displaying the results to the console.

using System;
using System.IO;

public class ProcessFile
{
    public static void Main()
    {
        try
        {
            using (StreamReader sr = File.OpenText("data.txt"))
            {
                Console.WriteLine($"The first line of this file is {sr.ReadLine()}");
            }
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine($"The file was not found: '{e}'");
        }
        catch (DirectoryNotFoundException e)
        {
            Console.WriteLine($"The directory was not found: '{e}'");
        }
        catch (IOException e)
        {
            Console.WriteLine($"The file could not be opened: '{e}'");
        }
    }
}
Imports System.IO

Public Class ProcessFile
    Public Shared Sub Main()
        Try
            Using sr As StreamReader = File.OpenText("data.txt")
                Console.WriteLine($"The first line of this file is {sr.ReadLine()}")
            End Using
        Catch e As FileNotFoundException
            Console.WriteLine($"The file was not found: '{e}'")
        Catch e As DirectoryNotFoundException
            Console.WriteLine($"The directory was not found: '{e}'")
        Catch e As IOException
            Console.WriteLine($"The file could not be opened: '{e}'")
        End Try
    End Sub
End Class

共通言語ランタイム (CLR) では、catch ブロックで処理されない例外がキャッチされます。The Common Language Runtime (CLR) catches exceptions not handled by catch blocks. CLR によって例外がキャッチされると、ご利用の CLR 構成に応じて次の結果のいずれかが発生する場合があります。If an exception is caught by the CLR, one of the following results may occur depending on your CLR configuration:

  • [デバッグ] ダイアログ ボックスが表示されます。A Debug dialog box appears.
  • プログラムの実行が停止され、例外情報を含むダイアログ ボックスが表示されます。The program stops execution and a dialog box with exception information appears.
  • 標準エラー出力ストリームにエラーが出力されます。An error prints out to the standard error output stream.

注意

ほとんどのコードで例外がスローされる可能性があります。また、OutOfMemoryException のように、CLR 自体によっていつでもスローされる可能性のある例外もあります。Most code can throw an exception, and some exceptions, like OutOfMemoryException, can be thrown by the CLR itself at any time. アプリケーションではこのようの例外を処理する必要はありませんが、他のユーザーが使用するライブラリを記述する際には、必要となる可能性があるので注意してください。While applications aren't required to deal with these exceptions, be aware of the possibility when writing libraries to be used by others. try ブロック内でコードを設定するタイミングに関しては、「例外の推奨事項」を参照してください。For suggestions on when to set code in a try block, see Best Practices for Exceptions.

参照See also