표준 예외 형식 Catch 및 Throw
업데이트: 2007년 11월
다음 지침은 .NET Framework에서 제공하는 예외 중 가장 많이 사용되는 몇 가지 예외에 대한 최선의 방법에 대해 설명합니다. Framework에서 제공하는 예외 클래스의 전체 목록을 보려면 .NET Framework 클래스 라이브러리 참조 문서를 참조하십시오.
Exception 및 SystemException
System.Exception 또는 System.SystemException을 throw하지 않습니다.
System.Exception 또는 System.SystemException은 다시 throw하려는 경우에만 프레임워크 코드에서 catch합니다.
System.Exception 또는 System.SystemException은 최상위 예외 처리기에서만 catch합니다.
ApplicationException
T:System.ApplicationException 클래스가 아닌 T:System.Exception 클래스에서 사용자 지정 예외를 파생시킵니다.
원래는 사용자 지정 예외를 ApplicationException 클래스에서 파생시켜야 하는 것으로 생각했지만 실제로는 이로 인해 얻는 이점이 그다지 크지 않은 것으로 밝혀졌습니다. 자세한 내용은 최선의 예외 처리 구현 방법을 참조하십시오.
InvalidOperationException
부적합한 상태에 있는 경우 System.InvalidOperationException 예외를 throw합니다. 개체의 현재 상태를 고려하여 속성 집합이나 메서드 호출이 적합하지 않은 경우 System.InvalidOperationException을 throw해야 합니다. 예를 들어, 읽기용으로 연 System.IO.FileStream에 쓰려고 하면 System.InvalidOperationException 예외를 throw해야 합니다.
관련 개체 집합의 상태 조합이 해당 작업에 대해 올바르지 않은 경우에도 이 예외가 throw되어야 합니다.
ArgumentException, ArgumentNullException 및 ArgumentOutOfRangeException
잘못된 인수가 멤버에 전달되는 경우 System.ArgumentException 또는 그 하위 형식 중 하나를 throw합니다. 가능한 경우 가장 많이 파생되는 예외 형식을 사용하는 것이 좋습니다.
다음 코드 예제에서는 인수가 null(Visual Basic의 경우 Nothing)인 경우 예외를 throw하는 방법을 보여 줍니다.
If (anObject = Nothing) Then
Throw New ArgumentNullException("anObject", "Specify a non-null argument.")
End If
if (anObject == null)
{
throw new ArgumentNullException("anObject",
"Specify a non-null argument.");
}
System.ArgumentException 또는 그 파생 형식 중 하나를 throw하는 경우 System.ArgumentException.ParamName 속성을 설정합니다. 이 속성은 예외를 throw한 매개 변수의 이름을 저장합니다. 이 속성은 생성자 오버로드 중 하나를 사용하여 설정할 수 있습니다.
속성 setter의 암시적 값 매개 변수의 이름에 대한 값을 사용합니다.
다음 코드 예제에서는 호출자가 null 인수를 전달하는 경우 예외를 throw하는 속성을 보여 줍니다.
Public Property Address() As IPAddress
Get
Return IPaddr
End Get
Set(ByVal value As IPAddress)
If IsNothing(value) Then
Throw New ArgumentNullException("value")
End If
IPaddr = value
End Set
End Property
public IPAddress Address
{
get
{
return address;
}
set
{
if(value == null)
{
throw new ArgumentNullException("value");
}
address = value;
}
}
공개적으로 호출할 수 있는 API가 System.NullReferenceException, System.AccessViolationException, System.InvalidCastException 또는 System.IndexOutOfRangeException을 명시적 또는 암시적으로 throw하지 못하게 합니다. 인수 검사를 수행하여 이러한 예외가 throw되지 않도록 합니다. 이러한 예외를 throw하면 시간이 흐르면서 변경될 수 있는 메서드의 구현 세부 사항이 노출됩니다.
StackOverflowException
System.StackOverflowException을 명시적으로 throw하지 않습니다. 이 예외는 CLR(공용 언어 런타임)에서만 명시적으로 throw해야 합니다.
System.StackOverflowException을 catch하지 않습니다.
스택 오버플로를 프로그래밍 방식으로 처리하는 것은 매우 어렵습니다. 이 예외가 프로세스를 종료할 수 있도록 하고 디버깅을 사용하여 문제가 발생한 위치를 확인해야 합니다.
OutOfMemoryException
System.OutOfMemoryException을 명시적으로 throw하지 않습니다. 이 예외는 CLR 인프라에서만 throw해야 합니다.
ComException 및 SEHException
System.Runtime.InteropServices.COMException 또는 System.Runtime.InteropServices.SEHException을 명시적으로 throw하지 않습니다. 이러한 예외는 CLR 인프라에서만 throw해야 합니다.
System.Runtime.InteropServices.SEHException을 명시적으로 catch하지 않습니다.
ExecutionEngineException
System.ExecutionEngineException을 명시적으로 throw하지 않습니다.
Portions Copyright 2005 Microsoft Corporation. All rights reserved.
Portions Copyright Addison-Wesley Corporation. All rights reserved.
디자인 지침에 대한 자세한 내용은 2005년에 Addison-Wesley에서 책으로 출간한 Krzysztof Cwalina와 Brad Abrams의 "Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries"를 참조하십시오.