throw (odwołanie w C#)

Sygnalizuje wystąpienie wyjątku podczas wykonywania programu.

Uwagi

Składnia polecenia throw jest następująca:

throw [e];

gdzie e jest wystąpieniem klasy pochodzącej z System.Exception klasy . W poniższym przykładzie użyto instrukcji , aby zgłosić argument , jeśli argument przekazany do metody o nazwie nie odpowiada prawidłowemu throw IndexOutOfRangeException GetNumber indeksowi tablicy wewnętrznej.

using System;

namespace Throw2
{
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];
   }
}

Następnie wywołujący metody używają bloku try-catch lub try-catch-finally do obsługi zgłoszonego wyjątku. Poniższy przykład obsługuje wyjątek zgłoszony przez GetNumber metodę .

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ątku

throw Można również użyć w catch bloku, aby ponownie zgłosić wyjątek obsługiwany w catch bloku. W takim przypadku throw argument nie uwzględnia operandu wyjątku. Jest to najbardziej przydatne, gdy metoda przekazuje argument z wywołującego do innej metody biblioteki, a metoda biblioteki zgłasza wyjątek, który musi zostać przekazany do wywołującego. Na przykład poniższy przykład ponownie zgłasza element , który jest zgłaszany podczas próby pobrania pierwszego NullReferenceException znaku niezainicjowanych ciągów.

using System;

namespace Throw
{
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żna również użyć składni w bloku, aby utworzyć wystąpienia nowego wyjątku, który jest przekazywać throw e catch do wywołującego. W takim przypadku ślad stosu oryginalnego wyjątku, który jest dostępny z właściwości StackTrace , nie jest zachowywany.

Wyrażenie throw

Począwszy od języka C# 7.0, można go używać jako throw wyrażenia oraz instrukcji . Dzięki temu można zgłaszać wyjątek w kontekstach, które wcześniej nie były obsługiwane. Są one następujące:

  • operator warunkowy. W poniższym przykładzie użyto throw wyrażenia , aby zgłosić wyjątek , jeśli metoda zostanie ArgumentException przekazana do pustej tablicy ciągów. Przed 7.0 języka C# ta logika musi być wyświetlana w instrukcji if / else .

    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 ujednania wartości null. W poniższym przykładzie wyrażenie jest używane z operatorem połączenia wartości null, aby zgłosić wyjątek, jeśli ciąg przypisany do throw Name właściwości to null .

    public string Name
    {
        get => name;
        set => name = value ??
            throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
    }
    
  • wyrażenie-wyrażenie lambda lub metoda. Poniższy przykład ilustruje metodę w treści wyrażenia, która zgłasza wyjątek , ponieważ konwersja na wartość InvalidCastException DateTime nie jest obsługiwana.

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

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też