다음을 통해 공유


예외 및 예외 처리

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

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

이 예제에서 메서드는 0으로 나누기를 테스트하고 오류를 catch합니다. 예외 처리를 사용하지 않을 경우 이 프로그램은 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("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException)
        {
            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의 관리되는 예외는 Win32 구조적 예외 처리 메커니즘을 토대로 구현됩니다. 자세한 내용은 구조적 예외 처리(C/C++)Win32 구조적 예외 처리에 대한 집중 과정을 참조하세요.

C# 언어 사양

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

참고 항목