다음을 통해 공유


예외 및 예외 처리

C# 언어의 예외 처리 기능은 프로그램이 실행 중일 때 발생하는 예기치 않거나 예외적인 상황을 처리하는 데 도움이 됩니다. 예외 처리는 try, catch, finally 키워드를 사용하여 성공하지 못할 수 있는 작업을 시도하고, 합리적으로 판단될 때 실패를 처리하며, 이후 리소스를 정리합니다. 예외는 CLR(공용 언어 런타임), .NET 또는 타사 라이브러리 또는 애플리케이션 코드에서 생성할 수 있습니다. 예외는 키워드를 throw 사용하여 생성됩니다.

대부분의 경우 코드가 직접 호출한 메서드가 아니라 호출 스택의 다른 메서드에 의해 예외가 throw될 수 있습니다. 예외가 발생하면 CLR은 스택을 해제하여 특정 예외 형식에 대한 catch 블록이 있는 메서드를 찾고, 찾은 첫 번째 catch 블록을 실행합니다. 호출 스택의 어느 곳에서도 적절한 catch 블록을 찾지 못하면 프로세스가 종료되고 사용자에게 메시지가 표시됩니다.

이 예제에서 메서드는 0으로 나누기를 테스트하고 오류를 포착합니다. 예외 처리가 없으면 이 프로그램은 DivideByZeroException이 처리되지 않은 오류로 종료됩니다.

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

예외 개요

예외에는 다음과 같은 속성이 있습니다.

  • 예외는 모두 궁극적으로 .에서 System.Exception파생되는 형식입니다.
  • 예외를 throw할 수 있는 명령문 주위에 try 블록을 사용하세요.
  • 블록에서 try 예외가 발생하면 제어 흐름이 호출 스택의 아무 곳에나 있는 첫 번째 연결된 예외 처리기로 이동합니다. C# catch 에서 키워드는 예외 처리기를 정의하는 데 사용됩니다.
  • 지정된 예외에 대한 예외 처리기가 없으면 프로그램에서 오류 메시지와 함께 실행을 중지합니다.
  • 예외를 처리하고 애플리케이션을 알려진 상태로 두지 않는 한 예외를 catch하지 마세요. System.Exception를 catch한 경우, throw 블록의 끝에서 catch 키워드를 사용하여 그것을 다시 throw합니다.
  • 블록이 catch 예외 변수를 정의하는 경우 이를 사용하여 발생한 예외 유형에 대한 자세한 정보를 얻을 수 있습니다.
  • 키워드를 사용하여 throw 프로그램에서 예외를 명시적으로 생성할 수 있습니다.
  • 예외 개체에는 호출 스택의 상태 및 오류에 대한 텍스트 설명과 같은 오류에 대한 자세한 정보가 포함됩니다.
  • 블록의 finally 코드는 예외가 throw되었는지에 관계없이 실행됩니다. finally 블록을 사용하여 리소스를 해제하십시오. 예를 들어, try 블록에서 열었던 스트림이나 파일을 닫기 위해 사용합니다.
  • .NET의 관리되는 예외는 Win32 구조적 예외 처리 메커니즘을 기반으로 구현됩니다. 자세한 내용은 구조적 예외 처리(C/C++)Win32 구조적 예외 처리의 깊이에 대한 크래시 코스를 참조하세요.

C# 언어 사양

자세한 내용은 C# 언어 사양예외를 참조하세요. 언어 사양은 C# 구문 및 사용의 최종 소스입니다.

참고하십시오