이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Exception 클래스

2013-12-13

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

Namespace:  System
어셈블리:  mscorlib(mscorlib.dll)

public class Exception

Exception 형식에서는 다음과 같은 멤버를 노출합니다.

  이름설명
Public 메서드Exception()Exception 클래스의 새 인스턴스를 초기화합니다.
Public 메서드Exception(String)지정된 오류 메시지를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다.
Public 메서드Exception(String, Exception)지정된 오류 메시지와 해당 예외의 근본 원인인 내부 예외에 대한 참조를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다.
맨 위

  이름설명
Public 속성Data예외에 대한 사용자 정의 추가 정보를 제공하는 키/값 쌍의 컬렉션을 가져옵니다.
Public 속성HelpLink이 예외와 관련된 도움말 파일에 대한 링크를 가져오거나 설정합니다.
Public 속성HResult특정 예외에 할당된 코드화된 숫자 값인 HRESULT를 가져오거나 설정합니다.
Public 속성InnerException현재 예외를 발생시킨 Exception 인스턴스를 가져옵니다.
Public 속성Message현재 예외를 설명하는 메시지를 가져옵니다.
Public 속성Source오류를 발생시키는 응용프로그램 또는 개체의 이름을 가져오거나 설정합니다.
Public 속성StackTrace현재 예외가 발생된 시간에 호출 스택의 프레임에 대한 문자열 표현을 가져옵니다.
맨 위

  이름설명
Public 메서드Equals(Object)지정한 Object가 현재 Object와 같은지 확인합니다. (Object에서 상속됨)
Protected 메서드Finalize가비지 수집기에서 Object를 회수하기 전에 개체가 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)
Public 메서드GetBaseException파생 클래스에서 재정의되었을 때, 하나 이상의 후속 예외의 근본 원인이 되는 Exception을 반환합니다.
Public 메서드GetHashCode특정 형식에 대한 해시 함수 역할을 합니다. (Object에서 상속됨)
Public 메서드GetType현재 인스턴스의 런타임 형식을 가져옵니다.
Protected 메서드MemberwiseClone현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)
Public 메서드ToString현재 예외에 대한 문자열 표현을 만들고 반환합니다. (Object.ToString()을(를) 재정의함)
맨 위

이 클래스는 모든 예외에 대한 기본 클래스입니다. 오류가 발생하면 시스템이나 현재 실행되고 있는 응용프로그램에서 오류에 관한 정보를 포함하는 예외를 발생하여 보고합니다. 발생된 예외는 응용프로그램이나 기본 예외 처리기에서 처리됩니다.

Try-Catch 블록

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

응용프로그램이 응용프로그램 코드 블록을 수행하는 중에 발생하는 예외를 다루는 경우, 해당 코드는 try 문 안에 있어야 합니다. try 문 안의 응용프로그램 코드는 try 블록입니다. try 블록에 의해 발생된 예외를 처리하는 응용프로그램 코드는 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 속성 안에 있습니다. 예외 개체를 만드는 동안 사용자가 텍스트 문자열을 생성자에게 전달하여 특정 예외를 자세히 설명할 수 있습니다. 오류 메시지 인수가 생성자에게 제공되지 않은 경우, 기본 오류 메시지가 사용됩니다.

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

예외 형식 카테고리

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

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

Exception 클래스 속성

Exception에는 코드 위치, 형식, 도움말 파일 및 예외의 원인을 식별하는 데 도움이 되는 StackTrace, InnerException, Message, HResultData 등의 다양한 속성이 포함되어 있습니다.

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

예외 개체를 만드는 동안 생성자에게 전달된 오류 메시지 문자열은 지역화되어야 하고, ResourceManager를 사용하여 리소스 파일로부터 제공됩니다.

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

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

성능 고려 사항

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

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

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

다음의 코드 예제에서는 ArithmeticException 오류를 처리하기 위해 정의된 catch 블록을 보여 줍니다. 이 catch 블록은 DivideByZeroExceptionArithmeticException에서 파생되고 DivideByZeroException 오류에 대해 명시적으로 정의된 catch 블록이 없으므로 DivideByZeroException 오류를 처리합니다.

참고참고:

이 예제를 실행하려면 Windows Phone용 정적 TextBlock 컨트롤이 있는 예제 빌드를 참조하세요.


using System;

class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      int x = 0;
      try
      {
         int y = 100 / x;
      }
      catch (ArithmeticException e)
      {
         outputBlock.Text += String.Format("ArithmeticException Handler: {0}", e.ToString()) + "\n";
      }
      catch (Exception e)
      {
         outputBlock.Text += String.Format("Generic Exception Handler: {0}", e.ToString()) + "\n";
      }
   }
}
/*
This code example produces the following results:

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

*/


Windows Phone OS

지원되는 버전: 8.0, 7.1, 7.0

Windows Phone

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

표시:
© 2015 Microsoft