예외 계층
업데이트: 2007년 11월
예외에는 두 가지 유형, 즉 실행 프로그램에서 생성한 예외와 공용 언어 런타임에서 생성한 예외가 있습니다. 또한, 응용 프로그램이나 런타임에서 throw될 수 있는 예외 계층이 있습니다.
Exception은 예외의 기본 클래스입니다. ApplicationException 및 SystemException과 같은 일부 예외 클래스는 Exception에서 직접 상속받습니다. 이러한 두 클래스가 거의 모든 런타임 예외의 기본이 됩니다.
Exception에서 직접 파생되는 대부분의 예외는 Exception 클래스에 어떤 기능도 추가하지 않습니다. 예를 들어, InvalidCastException 클래스 계층은 다음과 같습니다.
Object Exception SystemException InvalidCastException
런타임에서는 오류가 발생하면 SystemException의 해당 파생 클래스를 throw합니다. 이러한 오류는 배열 범위 초과 오류와 같은 런타임 검사 오류로 인해 발생하며 메서드를 실행할 때 발생할 수 있습니다. 새 예외를 만드는 응용 프로그램을 디자인하는 경우 이러한 예외를 Exception 클래스로부터 파생시켜야 합니다. SystemException은 catch하지 않는 것이 좋습니다. 또한 응용 프로그램에서 SystemException을 throw하도록 프로그래밍하는 것도 좋지 않습니다.
런타임이나 복구할 수 없는 상황에서 throw되는 가장 심각한 예외에는 ExecutionEngineException, StackOverflowException 및 OutOfMemoryException이 있습니다.
상호 운용성 예외는 SystemException에서 파생되며 ExternalException에 의해 더 확장됩니다. 예를 들어, COMException은 COM interop 작동 중에 throw된 예외이며 ExternalException에서 파생됩니다. ExternalException에서는 Win32Exception 및 SEHException도 파생됩니다.
런타임 예외 계층
런타임에는 개별 명령을 실행할 때 런타임에서 throw하는 SystemException에서 파생되는 기본 예외 집합이 있습니다. 다음은 런타임과, 파생된 클래스를 만들어야 하는 상황에서 제공되는 표준 예외를 계층적으로 나열한 표입니다.
예외 형식 |
기본 형식 |
설명 |
예제 |
---|---|---|---|
Object |
모든 예외의 기본 클래스입니다. |
없음(이 예외의 파생 클래스를 사용함) |
|
Exception |
모든 런타임 생성 오류의 기본 클래스입니다. |
없음(이 예외의 파생 클래스를 사용함) |
|
SystemException |
배열이 올바르지 않게 인덱싱되는 경우에만 런타임에 의해 throw됩니다. |
배열의 인덱스가 유효한 범위를 벗어남 arr[arr.Length+1] |
|
SystemException |
null 개체가 참조되는 경우에만 런타임에 의해 throw됩니다. |
object o = null; o.ToString(); |
|
잘못된 메모리가 액세스되는 경우에만 런타임에 의해 throw됩니다. |
비관리 코드 또는 안전하지 않은 관리 코드와 상호 운용하면서 잘못된 포인터가 사용될 때 발생합니다. |
||
SystemException |
유효하지 않은 상태에 있을 때 메서드에 의해 throw됩니다. |
내부 컬렉션에서 Item을 제거한 후 Enumerator.GetNext() 호출 |
|
SystemException |
모든 인수 예외의 기본 클래스입니다. |
없음(이 예외의 파생 클래스를 사용함) |
|
ArgumentException |
인수에 null을 허용하지 않는 메서드에 의해 throw됩니다. |
String s = null; "Calculate".IndexOf (s); |
|
ArgumentException |
인수가 지정된 범위에 있는지 검사하는 메서드에 의해 throw됩니다. |
String s = "string"; s.Chars[9]; |
|
SystemException |
런타임 외부에서 발생하거나 런타임 외부의 환경을 대상으로 하는 예외의 기본 클래스입니다. |
없음(이 예외의 파생 클래스를 사용함) |
|
ExternalException |
COM HRESULT 정보를 캡슐화하는 예외입니다. |
COM interop에 사용 |
|
ExternalException |
Win32 구조의 예외 처리 정보를 캡슐화하는 예외입니다. |
비관리 코드 interop에 사용 |