throw (Referencia de C#)
Indica la aparición de una excepción durante la ejecución del programa.
Observaciones
La sintaxis de throw
es la siguiente:
throw [e];
donde e
es una instancia de una clase derivada de System.Exception. En el ejemplo siguiente se usa la instrucción throw
para producir una excepción IndexOutOfRangeException si el argumento pasado a un método denominado GetNumber
no se corresponde con un índice válido de una matriz interna.
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];
}
}
Después, los autores de llamadas a método usan un bloque try-catch
o try-catch-finally
para controlar la excepción generada. En el ejemplo siguiente se controla la excepción producida por el método GetNumber
.
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
Inicio repetido de una excepción
throw
también se puede usar en un bloque catch
para volver a iniciar una excepción controlada en un bloque catch
. En este caso, throw
no toma un operando de excepción. Resulta más útil cuando un método pasa un argumento de un autor de llamada a otro método de biblioteca y el método de biblioteca produce una excepción que se debe pasar al autor de llamada. Por ejemplo, en el ejemplo siguiente se vuelve a iniciar una excepción NullReferenceException que se produce al intentar recuperar el primer carácter de una cadena sin inicializar.
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()
Importante
También puede usar la sintaxis throw e
en un bloque catch
para crear instancias de una nueva excepción que se pase al autor de llamada. En este caso, no se conserva el seguimiento de la pila de la excepción original, que está disponible en la propiedad StackTrace.
La expresión throw
Se puede usar throw
como una expresión y como una instrucción. Esto permite iniciar una excepción en contextos que antes no se admitían. Entre ellas se incluyen las siguientes:
El operador condicional. En el ejemplo siguiente se usa una expresión
throw
para iniciar una excepción ArgumentException si se pasa a un método una matriz de cadena vacía.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."); }
El operador de uso combinado de NULL. En el ejemplo siguiente, se usa una expresión
throw
con un operador de uso combinado de NULL para producir una excepción si la cadena asignada a una propiedadName
esnull
.public string Name { get => name; set => name = value ?? throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null"); }
Un método o lambda con forma de expresión. En el ejemplo siguiente se muestra un método con forma de expresión que produce una excepción InvalidCastException porque no se admite una conversión a un valor DateTime.
DateTime ToDateTime(IFormatProvider provider) => throw new InvalidCastException("Conversion to a DateTime is not supported.");
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.