throw(C# 참조)

프로그램 실행 중 예외 발생 신호를 보냅니다.

설명

throw의 구문은 다음과 같습니다.

throw [e];

여기서 eSystem.Exception에서 파생된 클래스의 인스턴스입니다. 다음 예제에서는 throw 문을 사용하여 GetNumber라는 메서드에 전달된 인수가 내부 배열의 유효한 인덱스에 해당하지 않는 경우 IndexOutOfRangeException 을 throw합니다.

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

그러면 메서드 호출자가 try-catch 또는 try-catch-finally 블록을 사용하여 throw된 예외를 처리합니다. 다음 예제에서는 GetNumber 메서드에 의해 throw된 예외를 처리합니다.

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

예외 다시 throw

catch 블록에서 throw를 사용하여 catch 블록에서 처리된 예외를 다시 throw할 수도 있습니다. 이 경우 throw는 예외 피연산자를 사용하지 않습니다. 이는 메서드가 호출자의 인수를 다른 일부 라이브러리 메서드에 전달하고 라이브러리 메서드가 호출자에게 전달되어야 하는 예외를 throw하는 경우에 가장 유용합니다. 예를 들어 다음 예제에서는 초기화되지 않은 문자열의 첫 번째 문자를 검색하려고 할 때 throw되는 NullReferenceException을 다시 throw합니다.

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

중요

catch 블록의 throw e 구문을 사용하여 호출자에게 전달하는 새 예외를 인스턴스화할 수도 있습니다. 이 경우 StackTrace 속성에서 제공되는 원래 예외의 스택 추적이 유지되지 않습니다.

throw

C# 7.0부터 throw를 명령문뿐만 아니라 식으로도 사용할 수 있습니다. 이렇게 하면 이전에 지원되지 않은 상황에서 예외를 throw할 수 있습니다. 여기에는 다음이 포함됩니다.

  • 조건 연산자. 다음 예제에서는 throw 식을 사용하여 메서드에 빈 문자열 배열이 전달된 경우 ArgumentException을 throw합니다. C# 7.0 이전에는 이 논리가 if/else 문에 표시되어야 합니다.

    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 병합 연산자. 다음 예제에서는 throw 식에 Null 병합 연산자를 사용하여 Name 속성에 할당된 문자열이 null인 경우 예외를 throw합니다.

    public string Name
    {
        get => name;
        set => name = value ??
            throw new ArgumentNullException(paramName: nameof(value), message: "Name cannot be null");
    }
    
  • 식 본문 람다 또는 메서드. 다음 예제에서는 DateTime 값으로 변환이 지원되지 않기 때문에 InvalidCastException을 throw하는 식 본문 메서드를 보여 줍니다.

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

C# 언어 사양

자세한 내용은 C# 언어 사양을 참조하세요. 언어 사양은 C# 구문 및 사용법에 대 한 신뢰할 수 있는 소스 됩니다.

참조