throw (C#-Referenz)throw (C# Reference)

Signalisiert das Auftreten einer Ausnahme während der Programmausführung.Signals the occurrence of an exception during program execution.

HinweiseRemarks

Die Syntax von throw lautet:The syntax of throw is:

throw [e]

Wo e eine Instanz einer Klasse ist, die von System.Exception abgeleitet wird.where e is an instance of a class derived from System.Exception. Im folgenden Beispiel wird die throw-Anweisung verwendet, um eine IndexOutOfRangeException auszulösen, wenn das Argument, das an eine Methode mit dem Namen GetNumber übergeben wurde, nicht auf einen gültigen Index eines internen Arrays reagiert.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];
   }
}

Methodenaufrufer verwenden anschließend einen try-catch- oder try-catch-finally-Block, um die ausgelöste Ausnahme zu behandeln.Method callers then use a try-catch or try-catch-finally block to handle the thrown exception. Im folgenden Beispiel wird die Ausnahme behandelt, die von der Methode GetNumber ausgelöst wurde.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

Erneutes Auslösen einer AusnahmeRe-throwing an exception

throw kann auch in einem catch-Block verwendet werden, um eine Ausnahme erneut auszulösen, die in einem catch-Block behandelt wurde.throw can also be used in a catch block to re-throw an exception handled in a catch block. In diesem Fall verwendet throw keinen Operanden für die Ausnahme.In this case, throw does not take an exception operand. Es ist besonders hilfreich, wenn eine Methode ein Argument in einer aufrufenden Funktion an eine andere Bibliotheksmethode übergibt, und die Bibliotheksmethode eine Ausnahme auslöst, die an den Aufrufer übergeben werden muss.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. Im folgenden Beispiel wird z.B. eine NullReferenceException erneut ausgelöst, die beim Versuch, das erste Zeichen einer deinitialisierten Zeichenfolge abzurufen, ausgelöst wird.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()

Wichtig

Sie können auch die throw e-Syntax in einem catch-Block verwenden, um eine neue Ausnahme zu instanziieren, die Sie an den Aufrufer übergeben.You can also use the throw e syntax in a catch block to instantiate a new exception that you pass on to the caller. In diesem Fall wird die Stapelüberwachung der ursprünglichen Ausnahme, die von der Eigenschaft StackTrace abrufbar ist, nicht beibehalten.In this case, the stack trace of the original exception, which is available from the StackTrace property, is not preserved.

Der throw-AusdruckThe throw expression

Ab C# 7 kann throw als Ausdruck sowie als Anweisung verwendet werden.Starting with C# 7, throw can be used as an expression as well as a statement. Dadurch wird eine Ausnahme in Kontexten ausgelöst, die zuvor nicht unterstützt wurden.This allows an exception to be thrown in contexts that were previously unsupported. Dazu gehören:These include:

  • Der bedingte Operator.the conditional operator. Im folgenden Beispiel wird ein throw-Ausdruck verwendet, um eine ArgumentException auszulösen, wenn eine Methode an ein leeres Zeichenfolgenarray übergeben wird.The following example uses a throw expression to throw an ArgumentException if a method is passed an empty string array. Diese Logik müsste vor C# 7 in einer if/else-Anweisung erscheinen.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.");                            
      
    }
    
  • Der NULL-Sammeloperator.the null-coalescing operator. Im folgenden Beispiel wird eine throw-Anweisung mit einem NULL-Sammeloperator verwendet, um eine Ausnahme auszulösen, wenn die Zeichenfolge, die einer Eigenschaft Name zugewiesen wurde, null ist.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));
    }   
    
  • Ein Ausdruckskörperlambda oder eine Ausdruckskörpermethode.an expression-bodied lambda or method. Das folgende Beispiel veranschaulicht eine Ausdruckskörpermethode, die eine InvalidCastException auslöst, da eine Konvertierung in einen DateTime-Wert nicht unterstützt wird.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#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ReferenzC# Reference
C#-ProgrammierhandbuchC# Programming Guide
try-catchtry-catch
Die try-, catch- und throw-Anweisungen in C++The try, catch, and throw Statements in C++
C#-SchlüsselwörterC# Keywords
AusnahmebehandlungsanweisungenException Handling Statements
Vorgehensweise: Explizites Auslösen von AusnahmenHow to: Explicitly Throw Exceptions