다음을 통해 공유


Exception 클래스

응용 프로그램을 실행할 때 나타나는 오류를 나타냅니다.

네임스페이스: System
어셈블리: mscorlib(mscorlib.dll)

구문

‘선언
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
<ClassInterfaceAttribute(ClassInterfaceType.None)> _
Public Class Exception
    Implements ISerializable, _Exception
‘사용 방법
Dim instance As Exception
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
[ClassInterfaceAttribute(ClassInterfaceType.None)] 
public class Exception : ISerializable, _Exception
[SerializableAttribute] 
[ComVisibleAttribute(true)] 
[ClassInterfaceAttribute(ClassInterfaceType::None)] 
public ref class Exception : ISerializable, _Exception
/** @attribute SerializableAttribute() */ 
/** @attribute ComVisibleAttribute(true) */ 
/** @attribute ClassInterfaceAttribute(ClassInterfaceType.None) */ 
public class Exception implements ISerializable, _Exception
SerializableAttribute 
ComVisibleAttribute(true) 
ClassInterfaceAttribute(ClassInterfaceType.None) 
public class Exception implements ISerializable, _Exception

설명

이 클래스는 모든 예외에 대한 기본 클래스입니다. 오류가 발생할 때 시스템이나 현재 실행 중인 응용 프로그램은 오류에 관한 정보를 포함한 예외를 throw하여 오류를 보고합니다. 한 번 throw된 예외는 응용 프로그램 또는 기본 예외 처리기에 의해 처리됩니다.

공용 언어 런타임은 예외를 개체로 표시하는 것과 프로그램 코드와 예외 처리 코드를 try 블록과 catch 블록으로 각각 분리하는 것에 기초한 예외 처리 모델을 제공합니다. 하나 이상의 catch 블록이 있을 수 있는데 각각은 예외의 특정 형식을 다루기 위한 것이거나 다른 블록보다 더 특정한 예외를 catch하는 데 사용하기 위한 블록입니다.

응용 프로그램이 응용 프로그램 코드 블록을 수행하는 중에 발생하는 예외를 다루는 경우, 해당 코드는 try 문 안에 있어야 합니다. try 문 안의 응용 프로그램 코드는 try 블록입니다. try 블록에 의해 throw된 예외를 처리하는 응용 프로그램 코드는 catch 문 안에 놓여지며 catch 블록이라고 합니다. 0개 이상의 catch 블록이 try 블록과 연결되며 각각의 catch 블록은 처리하는 예외의 형식을 확인하는 유형 필터를 포함합니다.

try 블록 안에서 예외가 발생할 경우, 시스템은 예외를 처리하는 catch 블록을 발견할 때까지 응용 프로그램 코드에 나타난 순서대로 연관된catch 블록을 찾습니다. catch 블록의 유형 필터가 T를 지정하거나 T가 파생된 형식을 지정하는 경우 catch 블록은 T 형식의 예외를 처리합니다. 시스템은 예외를 처리하는 첫째 catch 블록을 찾은 다음 검색을 멈춥니다. 이러한 이유 때문에, 응용 프로그램 코드에서 형식을 처리하는 catch 블록은 해당 형식의 기본 형식을 처리하는 catch 블록 이전에 지정되어야 하며 다음 단원의 예제에서 설명합니다. System.Exception을 처리하는 catch 블록은 마지막에 지정됩니다.

현재 try 블록과 연결된 catch 블록 중 어느 것도 예외를 처리하지 않으며 현재 try 블록이 현재 호출 중인 다른 try 블록 안에 중첩되어 있다면, 바로 포함하는 try 블록과 연결된 catch 블록이 검색됩니다. 예외에 대한 catch 블록이 발견되지 않는다면, 시스템은 현재 호출의 이전 중첩 수준을 검색합니다. 예외에 대한 catch 블록이 현재 호출에서 발견되지 않는 경우, 예외는 호출 스택에 올려지고 예외를 처리하는 catch 블록을 찾기 위해 이전 스택 프레임을 검색합니다. 호출 스택의 검색은 예외가 처리되거나 호출 스택에 더 이상의 프레임이 없을 때까지 계속됩니다. 예외를 처리하는 catch 블록을 찾지 못한 채 호출 스택의 최상위 수준에 도달한 경우, 기본 예외 처리기가 예외를 처리하고 응용 프로그램이 종료합니다.

예외 형식은 다음 기능을 지원합니다:

  • 오류를 설명하는, 사람이 인식할 수 있는 텍스트입니다. 예외가 발생하면 공용 언어 런타임은 텍스트 메시지를 통해 사용자에게 오류의 성격에 대해 알리며 문제를 해결하기 위한 작업을 제안합니다. 이러한 텍스트 메시지는 예외 개체의 Message 속성 안에 있습니다. 예외 개체를 만드는 동안 사용자가 텍스트 문자열을 생성자에게 전달하여 특정 예외를 자세히 설명할 수 있습니다. 오류 메시지 인수가 생성자에게 제공되지 않은 경우, 기본 오류 메시지가 사용됩니다.

  • 예외가 throw되었을 때 호출 스택의 상태입니다. StackTrace 속성에는 코드 안에서 오류가 발생한 곳을 확인하는 데 사용할 수 있는 스택 추적이 있습니다. 스택 추적은 모든 호출된 메서드와 호출이 수행된 소스 파일의 줄 번호를 나열합니다.

예외의 두 카테고리는 기본 클래스 Exception 아래에 있습니다:

  • 미리 정의된 공용 언어 런타임 예외 클래스는 SystemException에서 파생됩니다.

  • ApplicationException에서 파생된 사용자 정의 응용 프로그램 예외 클래스입니다.

Exception에는 StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite, Data 등의 여러 속성이 있어 코드 위치, 형식, 도움말 파일 및 예외의 원인을 식별하는 데 도움이 됩니다.

둘 이상의 예외 사이에 인과 관계가 존재할 경우, InnerException 속성은 이러한 정보를 유지합니다. 외부 예외는 이러한 내부 예외에 대한 응답으로 throw됩니다. 외부 예외를 처리하는 코드는 먼저 발생한 내부 예외의 정보를 사용하여 오류를 더 적절하게 처리할 수 있습니다. 예외에 대한 추가 정보는 Data 속성에 저장할 수 있습니다.

예외 개체를 만드는 동안 생성자에게 전달된 오류 메시지 문자열은 지역화되어야 하고, ResourceManager를 사용하여 리소스 파일로부터 제공됩니다. 지역화된 리소스에 대한 자세한 내용은 System.Resources 네임스페이스 개요와 리소스 패키징 및 배포를 참조하십시오.

사용자에게 예외가 발생한 이유에 관한 상세한 정보를 제공하기 위해 HelpLink 속성에 도움말 파일에 대한 URL 또는 URN을 둘 수 있습니다.

Exception은 0x80131500 값을 가지는 HRESULT COR_E_EXCEPTION을 사용합니다.

Exception 인스턴스의 초기 속성 값 목록에 대한 자세한 내용은 Exception 생성자를 참조하십시오.

성능 고려 사항

상당한 양의 시스템 리소스와 실행 시간이 예외를 throw하거나 처리할 때 사용되므로 예측 가능한 이벤트나 흐름 제어를 처리하는 경우가 아니라 정말 비정상적인 조건을 처리하는 경우에만 예외를 throw해야 합니다. 예를 들어, 메서드를 호출할 때는 유효한 매개 변수를 사용해야 하므로 메서드 인수가 잘못된 경우 응용 프로그램에서 예외를 throw하는 것은 적절할 수 있습니다. 여기서 잘못된 메서드 인수는 비정상적인 상황이 발생했음을 의미합니다. 반대로, 사용자가 때때로 잘못된 데이터를 입력할 수도 있으므로 사용자 입력이 잘못된 경우에는 예외를 throw하지 않아야 합니다. 이러한 경우에는 사용자가 올바른 데이터를 입력할 수 있도록 재시도 메커니즘을 제공합니다.

비정상적인 조건에 대해서만 예외를 throw한 다음 특정 예외에 적용되는 처리기가 아니라 응용 프로그램 대부분에 적용되는 범용 예외 처리기에서 예외를 catch합니다. 이렇게 해야 하는 이유는 대부분의 오류가 해당 오류와 가까운 곳에 있는 유효성 검사 및 오류 처리 코드로 처리될 수 있으므로 예외를 throw하거나 catch할 필요가 없기 때문입니다. 범용 예외 처리기는 응용 프로그램의 임의의 위치에서 throw된 정말로 예기치 않은 오류를 catch합니다.

또한 반환 코드가 충분하면 예외를 throw하지 않아야 하고, 반환 코드를 예외로 변환하지 않아야 하며, 정기적으로 예외를 catch하고 무시한 다음 처리를 계속하지 않아야 합니다.

예제

다음의 코드 예제에서는 ArithmeticException 오류를 처리하기 위해 정의된 catch 블록을 보여 줍니다. 이 catch 블록은 또한 DivideByZeroException 오류를 catch합니다. 왜냐하면 DivideByZeroExceptionArithmeticException에서 파생되었으며 DivideByZeroException 오류에 대해 명시적으로 정의된 catch 블록이 없기 때문입니다.

Imports System

Class ExceptionTestClass
   
   Public Shared Sub Main()
      Dim x As Integer = 0
      Try
         Dim y As Integer = 100 / x
      Catch e As ArithmeticException
         Console.WriteLine("ArithmeticException Handler: {0}", e.ToString())
      Catch e As Exception
         Console.WriteLine("Generic Exception Handler: {0}", e.ToString())
      End Try
   End Sub 'Main
End Class 'ExceptionTestClass
using System;

class ExceptionTestClass 
{
public static void Main() 
{
   int x = 0;
      try 
      {
         int y = 100/x;
      }
         catch (ArithmeticException e) 
         {
         Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
         }
            catch (Exception e) 
            {
            Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
            }
      } 
}
using namespace System;
int main()
{
   int x = 0;
   try
   {
      int y = 100 / x;
   }
   catch ( ArithmeticException^ e ) 
   {
      Console::WriteLine( "ArithmeticException Handler: {0}", e );
   }
   catch ( Exception^ e ) 
   {
      Console::WriteLine( "Generic Exception Handler: {0}", e );
   }

}
import System.*;

class ExceptionTestClass
{
    public static void main(String[] args)
    {
        int x = 0;
        try {
            int y = 100 / x;
        }
        catch (ArithmeticException e) {
            Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
        }
        catch (System.Exception e) {
            Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
        }
    } //main
} //ExceptionTestClass

C# 코드는 다음과 같이 출력합니다:

ArithmeticException Handler: System.DivideByZeroException: Attempted to divide by zero. at ExceptionTestClass.Main()

Visual Basic 코드는 다음과 같이 출력합니다:

ArithmeticException Handler: System.OverflowException: Exception of type System.OverflowException was thrown. at ExceptionTestClass.Main()

상속 계층 구조

System.Object
  System.Exception
     파생 클래스

스레드로부터의 안전성

이 형식의 모든 public static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

플랫폼

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework에서 모든 플래폼의 모든 버전을 지원하지는 않습니다. 지원되는 버전의 목록은 시스템 요구 사항을 참조하십시오.

버전 정보

.NET Framework

2.0, 1.1, 1.0에서 지원

.NET Compact Framework

2.0, 1.0에서 지원

참고 항목

참조

Exception 멤버
System 네임스페이스
SystemException
ApplicationException 클래스

기타 리소스

예외 처리 및 Throw
리소스 패키징 및 배포