throw (Riferimenti per C#)throw (C# Reference)

Segnala l'occorrenza di un'eccezione durante l'esecuzione del programma.Signals the occurrence of an exception during program execution.

NoteRemarks

La sintassi di throw è:The syntax of throw is:

throw [e]

dove e è un'istanza di una classe derivata da System.Exception.where e is an instance of a class derived from System.Exception. Nell'esempio seguente l'istruzione throw viene usata per generare una IndexOutOfRangeException, se l'argomento passato a un metodo denominato GetNumber non corrisponde a un indice valido di una matrice interna.The following example uses the throw statement to throw an IndexOutOfRangeException if the argument passed to a method named GetNumber does not correspond to a valid index of an internal array.

using System;

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

I caller al metodo usano quindi un blocco try-catch o try-catch-finally per gestire l'eccezione generata.Method callers then use a try-catch or try-catch-finally block to handle the thrown exception. L'esempio seguente gestisce l'eccezione generata dal metodo GetNumber.The following example handles the exception thrown by the GetNumber method.

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

Nuova generazione di un'eccezioneRe-throwing an exception

È possibile anche usare throw in un blocco catch per generare nuovamente un'eccezione gestita in un blocco catch.throw can also be used in a catch block to re-throw an exception handled in a catch block. In questo caso, throw non accetta un operando di eccezione.In this case, throw does not take an exception operand. È particolarmente utile quando un metodo passa un argomento da un caller a un altro metodo di raccolta e il metodo di raccolta genera un'eccezione che deve essere passata al caller.It is most useful when a method passes on an argument from a caller to some other library method, and the library method throws an exception that must be passed on to the caller. Nell'esempio seguente viene generata nuovamente una NullReferenceException, che viene generata quando si tenta di recuperare il primo carattere di una stringa non inizializzata.For example, the following example re-throws an NullReferenceException that is thrown when attempting to retrieve the first character of an uninitialized string.

using System;

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

È possibile anche usare la sintassi throw e in un blocco catch per creare un'istanza di una nuova eccezione da passare al caller.You can also use the throw e syntax in a catch block to instantiate a new exception that you pass on to the caller. In questo caso non viene mantenuta la traccia dello stack dell'eccezione originale, che è disponibile dalla proprietà StackTrace.In this case, the stack trace of the original exception, which is available from the StackTrace property, is not preserved.

Espressione throwThe throw expression

A partire da C# 7.0 è possibile usare throw come espressione e come istruzione.Starting with C# 7.0, throw can be used as an expression as well as a statement. Ciò consente di generare un'eccezione in contesti non supportati in precedenza.This allows an exception to be thrown in contexts that were previously unsupported. Sono inclusi:These include:

  • L'operatore condizionale.the conditional operator. Nell'esempio seguente viene usata un'espressione throw per generare una ArgumentException se a un metodo viene passato una matrice di stringa vuota.The following example uses a throw expression to throw an ArgumentException if a method is passed an empty string array. Prima di C# 7.0, la logica avrebbe dovuto usare un'istruzione if / else.Before C# 7.0, this logic would need to appear in an if/else statement.

    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'operatore null-coalescing.the null-coalescing operator. Nell'esempio seguente viene usata un'espressione throw con un operatore null-coalescing per generare un'eccezione, se la stringa assegnata a una proprietà Name è null.In the following example, a throw expression is used with a null-coalescing operator to throw an exception if the string assigned to a Name property is null.

    public string Name
    {
        get => name;
        set => name = value ?? 
            throw new ArgumentNullException("Name cannot be null", nameof(value));
    }   
    
  • lambda o metodo con corpo di espressione.an expression-bodied lambda or method. L'esempio seguente illustra un metodo con corpo di espressione che genera una InvalidCastException perché non è supportata una conversione in un valore DateTime.The following example illustrates an expression-bodied method that throws an InvalidCastException because a conversion to a DateTime value is not supported.

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

Specifiche del linguaggio C#C# language specification

Per altre informazioni, vedere la specifica del linguaggio C#.For more information, see the C# Language Specification. La specifica del linguaggio costituisce il riferimento ufficiale principale per la sintassi e l'uso di C#.The language specification is the definitive source for C# syntax and usage.

Vedere ancheSee also