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# 구문 및 사용의 최종 소스입니다.
참고하십시오
.NET