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á
throwvý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 vif/elsepří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
throwse výraz používá s operátorem pro sjednocení s hodnotou null, který vyvolá výjimku, pokud je řetězec přiřazenýNamevlastnostinull.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#.