throw (Справочник по C#)throw (C# Reference)

Сообщает о возникновении исключения во время выполнения программы.Signals the occurrence of an exception during program execution.

ПримечанияRemarks

Синтаксис throw выглядит следующим образом:The syntax of throw is:

throw [e]

где e — это экземпляр класса, производного от System.Exception.where e is an instance of a class derived from System.Exception. В следующем примере используется оператор throw для создания IndexOutOfRangeException, если аргумент, переданный в метод с именем GetNumber, не соответствует допустимому индексу внутреннего массива.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];
   }
}

Затем вызывающие объекты метода используют блок try-catch или try-catch-finally для обработки исключения.Method callers then use a try-catch or try-catch-finally block to handle the thrown exception. В следующем примере показана обработка исключения, созданного методом 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

Повторное создание исключенияRe-throwing an exception

throw можно также использовать в блоке catch для повторного создания исключения, обрабатываемого в блоке catch.throw can also be used in a catch block to re-throw an exception handled in a catch block. В этом случае оператор throw не принимает операнд исключения.In this case, throw does not take an exception operand. Это наиболее полезно, когда метод передает аргумент от вызывающего объекта в другой метод библиотеки, а метод библиотеки создает исключение, которое должно быть передано вызывающему объекту.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. Например, в следующем примере повторно создается исключение NullReferenceException, возникающее при попытке получить первый символ неинициализированной строки.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()

Важно!

Можно также использовать синтаксис throw e в блоке catch, чтобы создать исключение, которое будет передано вызывающему объекту.You can also use the throw e syntax in a catch block to instantiate a new exception that you pass on to the caller. В этом случае трассировка стека исходного исключения, которое доступно из свойства StackTrace, не сохраняется.In this case, the stack trace of the original exception, which is available from the StackTrace property, is not preserved.

Выражение throwThe throw expression

Начиная с C# 7.0 throw можно использовать в качестве выражения, а также как оператор.Starting with C# 7.0, throw can be used as an expression as well as a statement. Это позволяет вызывать исключения в контекстах, которые ранее не поддерживались.This allows an exception to be thrown in contexts that were previously unsupported. Сюда входит следующее.These include:

  • Условный оператор.the conditional operator. В следующем примере используется исключение throw для создания ArgumentException, если методу передается массив пустых строк.The following example uses a throw expression to throw an ArgumentException if a method is passed an empty string array. До выхода C# 7.0 эта логика должна была отображаться в операторе 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.");                            
      
    }
    
  • Оператор объединения с NULL.the null-coalescing operator. В следующем примере выражение throw используется с оператором, принимающим значение NULL, для создания исключения, если строка, назначенная свойству 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(paramName: nameof(value), message: "Name cannot be null");
    }   
    
  • Метод или лямбда, воплощающие выражение.an expression-bodied lambda or method. В следующем примере показан метод, воплощающий выражение, который создает InvalidCastException, так как преобразование в значение 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.");
    

Спецификация языка C#C# language specification

Дополнительные сведения см. в спецификации языка C#.For more information, see the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also