throw (Referenční dokumentace jazyka C#)

Signalizuje výskyt výjimky během provádění programu.

Poznámky

Syntaxe throw je:

throw [e];

kde e je instance třídy odvozené z System.Exception . Následující příklad používá throw příkaz k vyvolání příkazu, IndexOutOfRangeException Pokud argument předaný metodě s názvem neodpovídá GetNumber platnému indexu interního pole.

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];
   }
}

Volající metody pak používají try-catch try-catch-finally blok nebo pro zpracování vyvolané výjimky. Následující příklad zpracovává výjimku vyvolanou GetNumber metodou.

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

Opětovné vyvolání výjimky

throw lze také použít v catch bloku k opětovnému vyvolání výjimky zpracované v catch bloku. V tomto případě throw nebere v úvahu operand výjimky. Je nejužitečnější, pokud metoda předává argumentu od volajícího k některé jiné metodě knihovny a metoda knihovny vyvolá výjimku, která musí být předána volajícímu. Například následující příklad znovu vyvolá výjimku NullReferenceException , která je vyvolána při pokusu o načtení prvního znaku neinicializovaného řetězce.

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()

Důležité

Můžete také použít throw e syntaxi v catch bloku pro vytvoření instance nové výjimky, kterou předáte volajícímu. V tomto případě není zachováno trasování zásobníku původní výjimky, která je k dispozici z StackTrace Vlastnosti.

throwVýraz

Počínaje jazykem C# 7,0 throw lze použít jako výraz i příkaz. To umožňuje vyvolání výjimky v kontextech, které byly dříve nepodporované. Tady jsou některé z nich:

  • podmíněný operátor. Následující příklad používá throw výraz k vyvolání, ArgumentException Pokud je metoda předána prázdnému poli řetězce. Před C# 7,0 se tato logika musí objevit v if / else příkazu.

    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.");
    }
    
  • operátor slučování s hodnotou null. V následujícím příkladu throw se výraz používá s operátorem pro sjednocení s hodnotou null, který vyvolá výjimku, pokud je řetězec přiřazený Name vlastnosti null .

    public string Name
    {
        get => name;
        set => name = value ??
            throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
    }
    
  • výraz lambda nebo metoda těle. Následující příklad znázorňuje metodu těle výrazu, která vyvolá výjimku, InvalidCastException protože převod na DateTime hodnotu není podporován.

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

specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také