throw (référence C#)

Signale l’occurrence d’une exception pendant l’exécution du programme.

Notes

La syntaxe de throw est :

throw [e];

e est une instance d’une classe dérivée de System.Exception. L’exemple suivant utilise l’instruction throw pour lever une exception IndexOutOfRangeException si l’argument passé à une méthode nommée GetNumber ne correspond pas à un index valide d’un tableau interne.

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

Les appelants de méthode utilisent alors un bloc try-catch ou try-catch-finally pour gérer l’exception levée. L’exemple suivant gère l’exception levée par la méthode 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

Exception levée plusieurs fois

throw peut également être utilisé dans un bloc catch pour lever de nouveau une exception gérée dans un bloc catch. Dans ce cas, throw n’accepte pas d’opérande d’exception. Cela est très utile lorsqu’une méthode passe un argument d’un appelant à une autre méthode de bibliothèque, et que la méthode de bibliothèque lève une exception qui doit être passée à l’appelant. Par exemple, l’exemple suivant lève de nouveau une exception NullReferenceException qui est levée lorsque vous tentez de récupérer le premier caractère d’une chaîne non initialisée.

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

Important

Vous pouvez également utiliser la syntaxe throw e dans un bloc catch pour instancier une nouvelle exception que vous passez à l’appelant. Dans ce cas, la trace de la pile de l’exception d’origine, qui est disponible à partir de la propriété StackTrace, n’est pas conservée.

Expression throw

throw peut être utilisé en tant qu’expression ainsi qu’une instruction. Ainsi, une exception peut être levée dans des contextes qui n’étaient précédemment pas pris en charge. notamment :

  • opérateur conditionnel. l’exemple suivant utilise une expression throw pour lever une exception ArgumentException si une méthode reçoit un tableau de chaînes vide.

    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.");
    }
    
  • l’opérateur de fusion de Null : dans l’exemple suivant, une expression throw est utilisée avec un opérateur de fusion de Null pour lever une exception si la chaîne assignée à une propriété Name est null.

    public string Name
    {
        get => name;
        set => name = value ??
            throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
    }
    
  • un lambda ou une méthode expression-bodied : l’exemple suivant illustre une méthode expression-bodied qui lève une exception InvalidCastException, car une conversion vers une valeur DateTime n’est pas prise en charge.

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

spécification du langage C#

Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi