예외 처리 및 Throw
응용 프로그램은 실행 중에 발생하는 오류를 일관된 방식으로 처리할 수 있어야 합니다. 공용 언어 런타임에서는 일관된 방식으로 응용 프로그램에 오류를 알리기 위한 모델을 제공합니다. 모든 .NET Framework 작업에서는 예외를 throw하여 오류를 나타냅니다.
이 항목에는 다음과 같은 단원이 포함되어 있습니다.
.NET Framework의 예외
예외와 일반적인 오류 처리 방법의 비교
런타임에서 예외를 관리하는 방법
런타임 예외 필터링
관련 항목
참조
.NET Framework의 예외
예외란 프로그램 실행 중 발생한 모든 오류 상태 또는 예기치 못한 동작을 말합니다. 예외는 사용자의 코드나, 공유 라이브러리와 같이 사용자가 호출한 코드에 오류가 있거나, 운영 체제 리소스를 사용할 수 없게 되거나, 공용 언어 런타임에서의 예기치 못한 상황 등에 의해 발생합니다. 사용자가 작성한 응용 프로그램은 이러한 일부 상황으로부터 복구를 할 수 있지만 복구할 수 없는 경우도 있습니다. 응용 프로그램 예외로부터는 대부분 복구할 수 있지만 런타임 예외로부터는 대부분 복구할 수 없습니다.
.NET Framework에서 예외는 System.Exception에서 상속 받은 개체입니다. 예외는 문제가 발생한 코드 영역에서 throw됩니다. 예외는 응용 프로그램에서 이를 처리하기 전 또는 프로그램이 종료되기 전까지는 스택으로 전달됩니다.
맨 위로 이동
예외와일반적인 오류 처리 방법의 비교
기존의 언어 오류 처리 모델은 해당 언어에서 고유하게 제공하는 오류 감지 및 해당 오류 처리기 지정 방식에 의존하거나 운영 체제에서 제공하는 오류 처리 메커니즘에 의존했습니다. 런타임에서는 다음과 같은 기능을 사용하여 예외 처리를 구현합니다.
예외를 생성하는 언어나 예외를 처리하는 언어에 관계없이 예외를 처리합니다.
예외 처리에 특별한 언어 구문이 필요하지는 않지만 각 언어에서 고유한 구문을 정의할 수 있도록 허용합니다.
프로세스나 컴퓨터에 의해 그 범위를 제한 받지 않고 예외가 throw되도록 허용합니다.
예외를 사용하면 반환 코드와 같은 다른 오류 알림 방법 이상의 몇 가지 장점을 활용할 수 있습니다. 오류를 그냥 지나치지 않습니다. 잘못된 값이 시스템을 통해 다른 위치로 전파되지 않습니다. 반환 코드를 검사할 필요가 없습니다. 예외 처리 코드를 쉽게 추가하여 프로그램의 신뢰도를 높일 수 있습니다. 마지막으로, 이 런타임에서의 예외 처리는 Windows 기반 C++ 오류 처리보다 속도가 빠릅니다.
예외 스레드가 관리 코드 블록 및 비관리 코드 블록을 정기적으로 순회하기 때문에 런타임에서는 관리 코드 또는 비관리 코드에서 예외를 throw하거나 catch할 수 있습니다. 비관리 코드에는 C++ 형식의 SEH 예외와 COM 기반 HRESULTS를 사용할 수 있습니다.
런타임에서 예외를 관리하는 방법
런타임에서는 예외 개체 및 보호된 코드 블록을 기반으로 하는 예외 처리 모델을 사용합니다. Exception 개체는 예외가 발생할 때 예외를 나타내기 위해 만든 것입니다.
런타임에서는 각 실행 파일에 대한 예외 정보 테이블을 만듭니다. 실행 파일의 각 메서드는 예외 정보 테이블 내에 관련된 예외 처리 정보 배열을 갖고 있으며 이 배열은 빈 배열일 수도 있습니다. 이 배열의 각 엔트리는 보호된 코드 블록, 이 코드와 관련된 예외 필터, 모든 예외 처리기(catch 문)를 나타냅니다. 이 예외 테이블을 대단히 효율적이어서 예외가 발생하지 않은 경우에는 프로세서 시간이나 메모리 사용에 있어 성능에 영향을 주지 않습니다. 예외가 발생할 때에만 리소스를 사용합니다.
예외 정보 테이블에는 보호된 블록을 처리할 네 가지 예외 처리기가 있습니다.
블록 종료의 원인이 일반적인 제어 흐름에 있는지 처리되지 않는 예외에 있는지에 관계없이 블록이 끝날 때 실행되는 finally 처리기
예외 발생 시에만 실행되고 일반적인 제어 흐름이 완료될 때에는 실행되지 않는 fault 처리기
지정한 클래스의 예외나 이 클래스가 파생된 클래스의 예외를 처리하는 형식 필터 처리기
관련된 처리기로 예외를 처리할지 보호된 다음 블록으로 예외를 전달할지를 결정하기 위해 사용자 지정 코드를 실행하는 사용자 필터 처리기
각 언어는 이러한 예외 처리기를 해당 사양에 따라 구현합니다. 예를 들어, Visual Basic에서는 catch 문에 When 키워드를 사용하여 변수를 비교함으로써 사용자 필터 처리기에 액세스할 수 있지만 C#에서는 사용자 필터 처리기를 구현하지 않습니다.
예외가 발생하면 런타임에서는 두 단계의 과정이 시작됩니다.
런타임에서는 다음을 수행하는 보호된 첫 번째 블록을 배열에서 검색합니다.
현재 실행되고 있는 명령이 포함되어 있는 영역을 보호
예외 처리기를 포함하거나 예외를 처리하는 필터를 포함
일치하는 내용이 있으면 런타임에서는 예외를 나타내는 Exception 개체를 만듭니다. 그런 다음, 런타임에서 예외가 발생한 문과 예외를 처리하는 문 사이의 모든 finally 또는 오류 문을 실행합니다. 예외 처리기의 순서는 중요합니다. 가장 안쪽에 있는 예외 처리기가 제일 먼저 평가됩니다. 또한, 예외 처리기에서는 예외를 catch한 루틴의 지역 변수와 지역 메모리에 액세스할 수 있지만 예외가 throw되는 시점에서의 중간 값은 손실됩니다.
현재 메서드에 일치하는 내용이 없으면 런타임에서는 현재 메서드를 호출한 각 호출자를 검색하여 이러한 과정을 스택까지 진행합니다. 일치하는 내용이 있는 호출자가 없으면 런타임에서는 디버거에서 해당 예외에 액세스할 수 있도록 합니다. 이 디버거가 예외에 연결되지 않으면 런타임에서는 AppDomain.UnhandledException 이벤트를 발생시킵니다. 이 이벤트에 대한 수신기가 없으면 런타임에서는 스택 추적을 덤프한 다음 응용 프로그램을 끝냅니다.
맨 위로 이동
런타임 예외 필터링
유형이나 몇몇 사용자 정의 기준을 사용하여 catch 및 처리하는 예외를 필터링할 수 있습니다.
형식 필터 처리기는 특정 유형의 예외나 이 예외에서 파생된 클래스를 관리합니다. 다음 예제에서는 특정 예외, 여기서는 FileNotFoundException이라는 예외를 catch하기 위해 디자인된 형식 필터 처리기를 보여 줍니다.
Catch e As FileNotFoundException
Console.WriteLine("[Data File Missing] {0}", e)
catch (FileNotFoundException e)
{
Console.WriteLine("[Data File Missing] {0}", e);
}
catch (FileNotFoundException^ e)
{
Console::WriteLine("[Data File Missing] {0}", e);
}
사용자 필터 예외 처리기는 사용자가 예외에 대해 정의한 요구 사항을 기반으로 예외를 catch하고 처리합니다. 예외를 이 방식으로 필터링하는 데 대한 자세한 내용은 Catch 블록에 특정 예외 사용을 참조하십시오.
맨 위로 이동
관련 항목
제목 |
설명 |
---|---|
예외 개체의 각 요소를 설명합니다. |
|
대부분의 예외를 파생시키는 예외에 대해 설명합니다. |
|
catch, throw, finally 문을 사용하여 예외를 처리하는 방법에 대해 설명합니다. |
|
최선의 예외 처리 방법을 제안하고 설명합니다. |
|
비관리 코드에서 throw되고 catch되는 예외를 처리하는 방법에 대해 설명합니다. |
|
관리 코드 및 비관리 코드 사이에 예외를 매핑하는 방법에 대해 설명합니다. |
맨 위로 이동