throw (C# リファレンス)throw (C# Reference)

プログラムの実行中に例外が発生したことを通知します。Signals the occurrence of an exception during program execution.

コメントRemarks

throw の構文は次のとおりです。The syntax of throw is:

throw [e]

ここで eSystem.Exception から派生したクラスのインスタンスです。where e is an instance of a class derived from System.Exception. 次の例では、GetNumber という名前のメソッドに渡された引数が内部配列の有効なインデックスに対応していない場合に、throw ステートメントを使用して IndexOutOfRangeException をスローします。The following example uses the throw statement to throw an IndexOutOfRangeException if the argument passed to a method named GetNumber does not correspond to a valid index of an internal array.

using System;

public class NumberGenerator
{
   int[] numbers = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
   
   public int GetNumber(int index)
   {
      if (index < 0 || index >= numbers.Length) {
         throw new IndexOutOfRangeException();
      }
      return numbers[index];
   }
}

その後、メソッドの呼び出し元が try-catch ブロックまたは try-catch-finally ブロックを使用して、スローされた例外を処理します。Method callers then use a try-catch or try-catch-finally block to handle the thrown exception. 次の例では、GetNumber メソッドによってスローされた例外を処理します。The following example handles the exception thrown by the GetNumber method.

using System;

public class Example
{
   public static void Main()
   {
      var gen = new NumberGenerator();
      int index = 10;
      try {
          int value = gen.GetNumber(index);
          Console.WriteLine($"Retrieved {value}");
      }
      catch (IndexOutOfRangeException e) 
      {
         Console.WriteLine($"{e.GetType().Name}: {index} is outside the bounds of the array");
      }
   }
}
// The example displays the following output:
//        IndexOutOfRangeException: 10 is outside the bounds of the array

例外の再スローRe-throwing an exception

throwcatch ブロックで使用すると、catch ブロックで処理された例外を再スローすることもできます。throw can also be used in a catch block to re-throw an exception handled in a catch block. この場合、throw は例外オペランドを使用しません。In this case, throw does not take an exception operand. これは、メソッドが呼び出し元から他のライブラリ メソッドに引数を渡し、そのライブラリ メソッドが、呼び出し元に渡す必要がある例外をスローするときに最も役立ちます。It is most useful when a method passes on an argument from a caller to some other library method, and the library method throws an exception that must be passed on to the caller. たとえば、次の例では、初期化されていない文字列の最初の文字を取得しようとしたときにスローされた NullReferenceException を再スローします。For example, the following example re-throws an NullReferenceException that is thrown when attempting to retrieve the first character of an uninitialized string.

using System;

public class Sentence
{
   public Sentence(string s)
   {
      Value = s;
   }

   public string Value { get; set; }

   public char GetFirstCharacter()
   {
      try {
         return Value[0];
        }
      catch (NullReferenceException e) {
         throw;   
      } 
   }
}

public class Example 
{
   public static void Main()
   {
      var s = new Sentence(null);
      Console.WriteLine($"The first character is {s.GetFirstCharacter()}");
   }
}
// The example displays the following output:
//    Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
//       at Sentence.GetFirstCharacter()
//       at Example.Main()

重要

catch ブロックで throw e 構文を使用すると、呼び出し元に渡す新しい例外をインスタンス化することもできます。You can also use the throw e syntax in a catch block to instantiate a new exception that you pass on to the caller. この場合、StackTrace プロパティから使用できる、元の例外のスタック トレースが保持されません。In this case, the stack trace of the original exception, which is available from the StackTrace property, is not preserved.

throwThe throw expression

C# 7 以降、throw は、式およびステートメントとして使用できます。Starting with C# 7, throw can be used as an expression as well as a statement. これにより、以前サポートされていなかったコンテキストでの例外のスローが可能になります。This allows an exception to be thrown in contexts that were previously unsupported. 次の設定があります。These include:

  • 条件演算子the conditional operator. 次の例では、throw 式を使用して、メソッドに空の文字列配列が渡された場合に ArgumentException をスローします。The following example uses a throw expression to throw an ArgumentException if a method is passed an empty string array. C# 7 より前では、このロジックが if/else ステートメントで使用されている必要があります。Before C# 7, this logic would need to appear in an if/else statement.

    private static void DisplayFirstNumber(string[] args)
    {
       string arg = args.Length >= 1 ? args[0] : 
                                  throw new ArgumentException("You must supply an argument");
       if (Int64.TryParse(arg, out var number))
          Console.WriteLine($"You entered {number:F0}");
       else
          Console.WriteLine($"{arg} is not a number.");                            
      
    }
    
  • ull 合体演算子the null-coalescing operator. 次の例では、null 合体演算子と共に throw 式を使用して、Name プロパティに割り当てられた文字列が null の場合に例外をスローします。In the following example, a throw expression is used with a null-coalescing operator to throw an exception if the string assigned to a Name property is null.

    public string Name
    {
        get => name;
        set => name = value ?? 
            throw new ArgumentNullException("Name cannot be null", nameof(value));
    }   
    
  • 式形式のラムダまたはメソッド。an expression-bodied lambda or method. 次の例では、DateTime 値への変換がサポートされていないため InvalidCastException をスローする、式形式のメソッドを示しています。The following example illustrates an expression-bodied method that throws an InvalidCastException because a conversion to a DateTime value is not supported.

    DateTime ToDateTime(IFormatProvider provider) => 
             throw new InvalidCastException("Conversion to a DateTime is not supported.");
    

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

関連項目See Also

C# リファレンスC# Reference
C# プログラミング ガイドC# Programming Guide
try-catchtry-catch
Try、catch、および C++ では throw ステートメントThe try, catch, and throw Statements in C++
C# のキーワードC# Keywords
例外処理ステートメントException Handling Statements
方法: 例外を明示的にスローするHow to: Explicitly Throw Exceptions