throw (odwołanie w C#)throw (C# Reference)

Sygnalizuje wystąpienie wyjątku podczas wykonywania programu.Signals the occurrence of an exception during program execution.

UwagiRemarks

Składnia throw jest następująca:The syntax of throw is:

throw [e];

gdzie e jest wystąpieniem klasy pochodzącej od System.Exception.where e is an instance of a class derived from System.Exception. Poniższy przykład używa instrukcji throw, aby zgłosić IndexOutOfRangeException, jeśli argument przesłany do metody o nazwie GetNumber nie odpowiada prawidłowemu indeksowi tablicy wewnętrznej.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];
   }
}

Metody wywołujące stosują następnie try-catch lub try-catch-finally bloku, aby obsłużyć zgłoszony wyjątek.Method callers then use a try-catch or try-catch-finally block to handle the thrown exception. Poniższy przykład obsługuje wyjątek zgłoszony przez metodę 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

Ponowne zgłaszanie wyjątkuRe-throwing an exception

throw można również użyć w bloku catch, aby ponownie zgłosić wyjątek obsłużony w bloku catch.throw can also be used in a catch block to re-throw an exception handled in a catch block. W tym przypadku throw nie przyjmuje operandu wyjątku.In this case, throw does not take an exception operand. Jest to najbardziej przydatne, gdy metoda przekazuje argument od wywołującego do innej metody biblioteki, a metoda Library zgłasza wyjątek, który musi zostać przekazana do obiektu wywołującego.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. Na przykład poniższy przykład ponownie generuje NullReferenceException, który jest zgłaszany podczas próby pobrania pierwszego znaku niezainicjowanego ciągu.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()

Ważne

Możesz również użyć składni throw e w bloku catch, aby utworzyć wystąpienie nowego wyjątku przekazanego do obiektu wywołującego.You can also use the throw e syntax in a catch block to instantiate a new exception that you pass on to the caller. W takim przypadku śledzenie stosu oryginalnego wyjątku, który jest dostępny we właściwości StackTrace, nie jest zachowywane.In this case, the stack trace of the original exception, which is available from the StackTrace property, is not preserved.

Wyrażenie throwThe throw expression

Począwszy od C# 7,0, throw może służyć jako wyrażenie, a także instrukcja.Starting with C# 7.0, throw can be used as an expression as well as a statement. Pozwala to na wyrzucanie wyjątku w kontekstach, które były wcześniej nieobsługiwane.This allows an exception to be thrown in contexts that were previously unsupported. Należą do nich następujące elementy:These include:

  • operator warunkowy.the conditional operator. Poniższy przykład używa wyrażenia throw, aby zgłosić ArgumentException, jeśli metoda jest przenoszona pustą tablicę ciągów.The following example uses a throw expression to throw an ArgumentException if a method is passed an empty string array. Przed C# 7,0, ta logika powinna być wyświetlana w instrukcji if/else.Before C# 7.0, 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.");                            
      
    }
    
  • operator łączenia wartości null.the null-coalescing operator. W poniższym przykładzie wyrażenie throw jest używane z operatorem łączenia wartości null, aby zgłosić wyjątek, jeśli ciąg przypisany do właściwości Name jest 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(paramName: nameof(value), message: "Name cannot be null");
    }   
    
  • wyrażenie wyrażenia lambda lub metody.an expression-bodied lambda or method. Poniższy przykład ilustruje metodę zanikającą z wyrażenia, która zgłasza InvalidCastException, ponieważ konwersja do wartości DateTime nie jest obsługiwana.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.");
    

specyfikacja języka C#C# language specification

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#.For more information, see the C# Language Specification. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.The language specification is the definitive source for C# syntax and usage.

Zobacz takżeSee also