예외 및 예외 처리(C# 프로그래밍 가이드)

C# 언어에서는 프로그램 실행 중에 발생하는 예기치 않은 상황이나 예외 상황을 처리하기 위한 예외 처리 기능을 제공합니다. 예외 처리에는 성공하지 않을 수 있는 작업을 시도하고, 작업을 수행할 이유가 있는지 결정되었을 때 오류를 처리하고, 나중에 리소스를 정리하기 위한 try, catch 및 finally 키워드가 사용됩니다. 예외는 CLR(공용 언어 런타임), .NET Framework나 타사 라이브러리 또는 응용 프로그램 코드에서 발생할 수 있습니다. 이러한 예외는 throw 키워드를 사용하여 생성됩니다.

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

이 예제의 메서드에서는 0으로 나누기 여부를 테스트하고 오류를 catch합니다. 예외를 처리하지 않는다면 이 프로그램은 DivideByZeroException was unhandled 오류 메시지와 함께 종료됩니다.

class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new System.DivideByZeroException();
        return x / y;
    }
    static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result = 0;

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

예외 개요

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

  • 예외는 모두 궁극적으로 System.Exception에서 파생되는 형식입니다.

  • 예외가 throw될 가능성이 있는 문 주위에 try 블록을 추가합니다.

  • try 블록 내에서 예외가 발생한 경우 호출 스택에 있는 첫 번째 관련 예외 처리기로 제어 흐름이 이동합니다. C#에서 예외 처리기를 정의하는 데는 catch 키워드가 사용됩니다.

  • 발생한 예외에 대한 예외 처리기가 없으면 프로그램의 실행이 중지되고 오류 메시지가 나타납니다.

  • 예외를 처리할 수 없는 경우 예외를 catch하지 않고 응용 프로그램을 알려진 상태로 두어야 합니다. System.Exception을 catch한 경우 catch 블록 끝에서 throw 키워드를 사용하여 다시 throw합니다.

  • catch 블록에 예외 변수가 정의된 경우 이를 통해 발생한 예외 형식에 대한 자세한 정보를 확인할 수 있습니다.

  • throw 키워드를 사용하면 프로그램에서 예외를 명시적으로 생성할 수 있습니다.

  • 예외 개체에는 호출 스택의 상태와 오류를 설명하는 텍스트를 비롯하여 오류에 대한 자세한 정보가 포함됩니다.

  • finally 블록의 코드는 예외가 throw되어도 실행되므로 finally 블록을 사용하여 리소스를 해제합니다. 예를 들어, try 블록에 열려 있는 스트림이나 파일을 닫습니다.

  • .NET Framework의 관리되는 예외는 Win32 구조적 예외 처리 메커니즘을 기반으로 구현됩니다. 자세한 내용은 Structured Exception Handling (C++)A Crash Course on the Depths of Win32 Structured Exception Handling을 참조하십시오.

관련 단원

예외와 예외 처리에 대한 자세한 내용은 다음 항목을 참조하십시오.

C# 언어 사양

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

참고 항목

참조

C# 키워드

throw(C# 참조)

try-catch(C# 참조)

try-finally(C# 참조)

try-catch-finally(C# 참조)

개념

C# 프로그래밍 가이드

예외 처리 및 Throw

예외 처리 및 Throw

기타 리소스

예외 디자인 지침

안정적인 .NET 코드 작성

특정 예외에 대한 미니덤프