표준 예외 형식 Catch 및 Throw

다음 지침은 .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.");
}
if (anObject == nullptr)
{
    throw gcnew 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;
    }
}
property IPAddress^ Address
{
    IPAddress^ get()
    {
        return address;
    }
    void set(IPAddress^ value)
    {
        if (value == nullptr)
        {
            throw gcnew 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.

디자인 지침에 자세한 내용은 참조를 "Framework 디자인 지침: 규칙, 숙어, 및 재사용에 대 한 패턴입니다.NET 라이브러리"도 서 Krzysztof Cwalina와 Brad Abrams, 게시 Addison-wesley, 2005.

참고 항목

개념

Throw할 예외의 올바른 형식 선택

기타 리소스

클래스 라이브러리 개발을 위한 디자인 지침

예외 디자인 지침