내보내기(0) 인쇄
모두 확장
이 문서는 기계로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오. 추가 정보
번역
원본

Exception 클래스

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

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

[SerializableAttribute]
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public class Exception : ISerializable, _Exception

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

  이름설명
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Exception() Exception 클래스의 새 인스턴스를 초기화합니다.
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Exception(String)지정된 오류 메시지를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다.
Protected 메서드Exception(SerializationInfo, StreamingContext)serialize된 데이터를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다.
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Exception(String, Exception)지정된 오류 메시지와 해당 예외의 원인인 내부 예외에 대한 참조를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다.
위쪽

  이름설명
Public 속성이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Data예외에 대한 사용자 정의 추가 정보를 제공하는 키/값 쌍의 컬렉션을 가져옵니다.
Public 속성이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원HelpLink이 예외와 관련된 도움말 파일에 대한 링크를 가져오거나 설정합니다.
Public 속성XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원HResult특정 예외에 할당된 코드화된 숫자 값인 HRESULT를 가져오거나 설정합니다.
Public 속성XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원InnerException현재 예외를 발생시킨 Exception 인스턴스를 가져옵니다.
Public 속성XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Message현재 예외를 설명하는 메시지를 가져옵니다.
Public 속성이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Source오류를 발생시키는 응용 프로그램 또는 개체의 이름을 가져오거나 설정합니다.
Public 속성XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원StackTrace호출 스택의 직접 실행 프레임에 대한 문자열 표현을 가져옵니다.
Public 속성TargetSite현재 예외를 throw하는 메서드를 가져옵니다.
위쪽

  이름설명
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Equals(Object) 지정한 개체가 현재 개체와 같은지 여부를 확인합니다. (Object에서 상속됨)
Protected 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원Finalize 개체가 가비지 수집자에서 회수되기 전에, 해당 개체에서 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원GetBaseException파생 클래스에서 재정의되었을 때, 하나 이상의 후속 예외의 근본 원인이 되는 Exception을 반환합니다.
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원GetHashCode기본 해시 함수로 작동합니다. (Object에서 상속됨)
Public 메서드GetObjectData파생 클래스에서 재정의될 때, 예외에 관한 정보를 SerializationInfo에 설정합니다.
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원GetType현재 인스턴스의 런타임 형식을 가져옵니다.

XNA Framework 3.0에서 이 멤버는 Object.GetType()에서 상속되었습니다.


이식 가능한 클래스 라이브러리 이식 가능한 클래스 라이브러리에서 이 멤버는 Object.GetType()에서 상속되었습니다.


Windows 스토어 앱용 .NET Windows 8에서 이 멤버는 Object.GetType()에서 상속되었습니다.
Protected 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원MemberwiseClone현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)
Public 메서드XNA Framework에서 지원이식 가능한 클래스 라이브러리에서 지원Windows 스토어 앱용 .NET에서 지원ToString현재 예외에 대한 문자열 표현을 만들고 반환합니다. (Object.ToString()을(를) 재정의함)
위쪽

  이름설명
Protected 이벤트SerializeObjectState예외에 대한 serialize된 데이터가 들어 있는 예외 상태 개체가 만들어지도록 예외가 serialize될 때 발생합니다.
위쪽

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

이 섹션의 내용

오류 및 예외들
Try/catch 블록
예외 형식 기능
예외 클래스 속성
성능 고려 사항
표준 예외를 선택.
사용자 지정 예외를 구현합니다.

오류 및 예외들

런타임 오류는 여러 가지 이유로 발생될 수 있습니다. 그러나 코드에서 모든 오류는 예외로 처리되지 않습니다. 적절하게 응답할 수 있고 실행된 시간에 발생할 수 있는 오류의 일부 범주는 다음과 같습니다.

  • 오류 사용량 오류 사용량은 예외를 발생 시킬 수 있는 프로그램 논리에서 오류를 나타냅니다. 그러나 예외 처리를 통하지 않지만 잘못된 코드를 수정하여 오류를 해결해야 합니다. 예를 들어, Object.Equals(Object) 메서드의 재정의는 다음 예제에 obj 인수는 항상 null 이 아니여야만 하는 사실을 추정합니다.

    
    using System;
    
    public class Person
    {
       private string _name;
    
       public string Name 
       {
          get { return _name; } 
          set { _name = value; }
       }
    
       public override int GetHashCode()
       {
          return this.Name.GetHashCode();  
       }  
    
       public override bool Equals(object obj)
       {
          // This implementation contains an error in program logic:
          // It assumes that the obj argument is not null.
          Person p = (Person) obj;
          return this.Name.Equals(p.Name);
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person p1 = new Person();
          p1.Name = "John";
          Person p2 = null; 
    
          // The following throws a NullReferenceException.
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
       }
    }
    
    
    

    이러한 NullReferenceException 예외는 objnull 일때, 결과는 소스 코드를 널을 위한 명시적인 테스트로 수정함에있어서 제거될 수 있습니다. 이는 Object.Equals 재정의를 호출하고, 그때 다시 컴파일링 하기 전입니다. 다음 예제는 null 인수를 처리하는 올바른 소스 코드를 포함합니다.

    
    using System;
    
    public class Person
    {
       private string _name;
    
       public string Name 
       {
          get { return _name; } 
          set { _name = value; }
       }
    
       public override int GetHashCode()
       {
          return this.Name.GetHashCode();  
       }  
    
       public override bool Equals(object obj)
       {
           // This implementation handles a null obj argument.
           Person p = obj as Person; 
           if (p == null) 
              return false;
           else
              return this.Name.Equals(p.Name);
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person p1 = new Person();
          p1.Name = "John";
          Person p2 = null; 
    
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
       }
    }
    // The example displays the following output:
    //        p1 = p2: False
    
    
    

    사용 오류에 대해 예외 처리를 사용 하지 않고 사용할 수 있습니다는 Debug.Assert 디버그 빌드에서 사용 오류를 식별 하는 메서드 및 Trace.Assert 사용 오류 디버그와 릴리스를 식별 하는 메서드를 만듭니다. 자세한 내용은 관리 코드에 어설션 사용을 참조하십시오.

  • 프로그램 오류 프로그램 오류는 버그 없는 코드를 작성함에 의해 필수적으로 피할 수 없는 런타임오류입니다.

    경우에 따라 프로그램 오류는 일상적인 또는 예상 된 오류 상태를 반영할 수 있습니다. 이 경우 예외 처리를 사용하여 프로그램 오류를 처리하고 대신 해당 작업을 다시 시도 하지 않아도 좋습니다. 예를 들어, 사용자가 특정형식으로 날짜를 입력해야 하는 경우, DateTime.TryParseExact 메서드를 호출함으로써 날짜 문자열을 분석할 수 있습니다. 이는 Boolean 값을 반환하는데, 이 값은 분석 작업이 성공적인지 DateTime.ParseExact 메서드를 사용하는 대신에 예시합니다. 이는 FormatException 예외를 쓰로우합니다. 이는 날짜 문자열이 DateTime 값을 변환할수 없을 경우입니다. 마찬가지로, 사용자가 존재 하지 않는 파일을 열려고 하면, 먼저 File.Exists 메서드를 파일이 존재하는지 체크하기 위해 호출하고, 그렇지 않다면, 사용자가 생성하기 원하는 방향으로 작성합니다.

    다른 경우에 프로그램 오류 코드에서 처리할 수 있는 예기치 않은 오류 조건을 반영합니다. 예를 들어, 파일이 존재하는지 확신이 필요할경우, 열기전에 삭제가 되거나 손상될수도 있습니다. 이러한 경우, StreamReader 개체를 설명함으로써 파일을 열려고 시도하거나 Open 메서드를 호출하는 것은 FileNotFoundException 예외를 쓰로우합니다. 이러한 경우 예외 오류에서 복구 하는 처리를 사용 해야 합니다.

  • 시스템 오류 시스템 오류는 의미있는 방식에서 프로그래밍적으로 처리할 수 없는 런타임 오류입니다. 예를 들어, 모든 메서드는 OutOfMemoryException 예외를 쓰로우할 수 있습니다. 이는 공용 언어 런타임이 부가적인 메모리를 할당하는 것이 어려울 경우입니다. 일반적으로 시스템 오류는 예외 처리를 함으로써 처리되지 않습니다. 대신에, AppDomain.UnhandledException 와 같은 이벤트를 사용할 수 있고 Environment.FailFast 메서드를 예외 정보를 로그하고 응용프로그램이 종료되기 전에 실패를 사용자에게 알리기 위해 호출합니다.

Try/catch 블록

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

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

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

예외 클래스 속성

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

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

예외 개체를 만드는 동안 생성자에게 전달된 오류 메시지 문자열은 지역화되어야 하고, ResourceManager 클래스를 사용하여 리소스 파일로부터 제공됩니다. 지역화된 자원에 대한 자세한 내용은 데스크톱 응용 프로그램용 위성 어셈블리 만들기데스크톱 응용 프로그램의 리소스 패키징 및 배포 항목을 참조하십시오.

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

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

Exception 클래스의 인스턴스에 대한 초기 속성 값 목록을 보려면 Exception 생성자를 참조하십시오.

성능 고려 사항

예외를 쓰로우하거나 처리하는것은 충분한 양의 시스템 자원 및 실행 시간을 소비합니다. 예측 가능한 이벤트나 흐름 제어를 처리하는 경우가 아니라 정말 비정상적인 조건을 처리하는 경우에만 예외를 throw해야 합니다. 예를 들어, 클래스 라이브러리를 개발 하는 경우와 같은 일부 경우에이 메서드 인수가 유효 하지 않거나 유효한 매개 변수를 사용 하 여 호출 될 메서드를 예상 하기 때문에 예외를 throw 합니다. 잘못 된 메서드 인수를 사용 오류 결과가 없는 경우에 비정상적인 상황이 발생 했음을 의미 합니다. 반대로, 사용자가 때때로 잘못된 데이터를 입력할 수도 있으므로 사용자 입력이 잘못된 경우에는 예외를 쓰로우하지 않아야 합니다. 대신에, 이러한 경우에는 사용자가 올바른 데이터를 입력할 수 있도록 재시도 메커니즘을 제공합니다. 또는 예외 사용 오류 처리를 사용 해야 합니다. 대신 사용 하 여 어설션 을 식별 하 고 사용 오류를 수정 합니다.

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

표준 예외를 선택.

예외를 쓰로우할 경우 사용자 지정 예외를 구현 하는 대신.NET Framework 기존 예외 형식을 자주 사용할 수 있습니다. 이러한 두 가지 조건에서 표준 예외 형식을 사용 해야 합니다.

  • 사용 오류로 인해 발생 하는 예외를 쓰로우합니다. (즉, 메서드를 호출 하는 개발자에 의해 수행 되는 프로그램 논리에서 오류가 발생합니다.). 일반적으로 ArgumentException, ArgumentNullException, InvalidOperationException, 또는 NotSupportedException 과 같은 예외를 쓰로우 합니다. 예외 개체를 인스턴스화하는 기술 오류는 개발자가 해결할 수 있도록 예외 개체의 생성자에 제공하는 문자열입니다. 자세한 내용은 Message 속성을 참조하십시오.

  • 기존.NET Framework 예외를 호출자에게 전달할 수 있는 오류를 처리합니다. 가능하면 가장 많이 파생 된 예외를 쓰로우해야 합니다. 예를 들어, 메서드 인수를 열거형의 유효한 멤버가 될 경우 InvalidEnumArgumentException (가장 많이 파생 클래스) 보다는 ArgumentException를 쓰로우해야합니다.

사용자 지정 예외를 구현합니다.

다음과 같은 경우, 기존.NET Framework 예외를 사용하여 오류 조건을 처리 하는 것은 적합하지 않습니다.

  • 예외는 기존.NET Framework 예외에 매핑할 수 없는 고유 프로그램 오류를 일으킬 경우입니다.

  • 예외 처리 하는 적절 한 기존.NET Framework 예외 또는 예외 처리와에서 다른 필요한 경우 비슷한 예외를 명확히 해야 합니다. 예를 들어, ArgumentOutOfRangeException 예외를 쓰로우할 경우, 계열 대상 형식의 범위 밖에 있는 문자열의 숫자 값을 구문 분석할 때 예외가 발생 하면 하지 않을 것 같은 예외를 사용하여 메서드를 호출할 때 제한 하는 결과를 호출자에게 제공하는 것은 적절한 오류 값입니다.

이러한 Exception 클래스는 .NET Framework의 모든 예외에 대한 기본 클래스입니다. 다양하게 파생된 클래스 멤버의 상속된 동작을 사용한 Exception 클래스입니다. Exception 인 멤버를 재정의 하지 않거나 모든 고유 멤버를 정의할 수 없습니다.

파생되는 클래스를 정의합니다.

  1. 이러한 Exception것으로부터 상속되는 클래스를 정의합니다. 필요한 경우, 클래스는 예외에 대한 추가 정보를 제공하는 데 필요한 고유한 멤버를 정의 합니다. 예를 들어, ArgumentException 클래스에 포함된 ParamName 속성은 예외를 발생하는 해당 인수 매개 변수의 이름을 지정하고 RegexMatchTimeoutException 속성에 포함된 MatchTimeout 시간 제한 간격을 나타내는 속성입니다.

  2. 필요에 따라 기능을 변경 또는 수정 하는 상속된 멤버를 재정의합니다. 대부분의 기존 파생 클래스는 Exception 상속 된 멤버의 동작을 재정의 하지 마십시오.

  3. 사용자 지정 예외 개체는 직렬화 할 수 있는지 여부를 확인 합니다. 직렬화 예외에 대한 정보를 저장하고 원격 컨텍스트를 공유 하는 서버 및 클라이언트 프록시 예외 정보를 사용합니다. 예외 개체를 직렬화 하는것을 SerializableAttribute 특성을 사용하여 만들기

  4. 예외 클래스의 생성자를 정의 합니다. 일반적으로 예외 클래스는 다음 생성자 중 하나 이상:

    • Exception() 새 예외 개체의 속성을 초기화 하는 데 기본값을 사용합니다.

    • Exception(String) 에 지정 된 오류 메시지와 함께 새 예외 개체를 초기화 합니다.

    • Exception(String, Exception) 에 지정 된 오류 메시지와 내부 예외를 사용 하 여 새 예외 개체를 초기화 합니다.

    • Exception(SerializationInfo, StreamingContext) 되는 protected 연속화된 데이터에서 새 예외 개체를 초기화 하는 생성자입니다. 예외 개체를 직렬화 할 수 있도록 하려는 경우, 이 생성자를 구현해야 합니다.

다음 예제는 사용자 지정 예외 클래스를 사용 합니다. 이는 NotPrimeException 클라이언트가 최적입니다 시작 번호를 지정하여 소수로 이루어진 시퀀스를 검색 하려고 할 때 쓰로우되는 예외입니다. 예외는 새 속성을 NonPrime을 정의합니다. 이는 예외를 발생하는 비-프라임 번호를 반환합니다. Protected 생성자 및 생성자 구현 외에도 SerializationInfoStreamingContext 를 연속화된 매개변수 NotPrimeException 를 지원하기 위해 세 가지 추가 생성자를 정의 하는 클래스는 NonPrime 속성입니다. 각 생성자의의 소수 숫자가 아닌 값을 유지 하는 것 외에도 기본 클래스 생성자를 호출 합니다. NotPrimeException 클래스는 또한 SerializableAttribute 특성을 사용하여 표시합니다.


using System;
using System.Runtime.Serialization;

[Serializable()]
public class NotPrimeException : Exception
{
   private int notAPrime;

   protected NotPrimeException()
      : base()
   { }

   public NotPrimeException(int value) :
      base(String.Format("{0} is not a prime number.", value))
   {
      notAPrime = value;
   }

   public NotPrimeException(int value, string message)
      : base(message)
   {
      notAPrime = value;
   }

   public NotPrimeException(int value, string message, Exception innerException) :
      base(message, innerException)
   {
      notAPrime = value;
   }

   protected NotPrimeException(SerializationInfo info,
                               StreamingContext context)
      : base(info, context)
   { }

   public int NonPrime
   { get { return notAPrime; } }
}


PrimeNumberGenerator 클래스는 다음 예제와 같이 클래스 에라토스테네스의 체를 사용하여 클라이언트가 해당 클래스 생성자에 대한 호출에 지정된 한계를 2에서 소수로 이루어진 시퀀스를 계산합니다. GetPrimesFrom 메서드는 특정한 낮은 한도가 훨씬 크거나 동일한 모든 주요한 수를 반환합니다. 하지만 NotPrimeException 를 쓰로우합니다. 이는 더 낮은 한도를 주요수가 아닐 경우입니다.


using System;
using System.Collections.Generic;


[Serializable]
public class PrimeNumberGenerator
{
   private const int START = 2;
   private int maxUpperBound = 10000000;
   private int upperBound;
   private bool[] primeTable;
   private List<int> primes = new List<int>();

   public PrimeNumberGenerator(int upperBound)
   {
      if (upperBound > maxUpperBound)
      {
         string message = String.Format(
                           "{0} exceeds the maximum upper bound of {1}.",
                           upperBound, maxUpperBound);
         throw new ArgumentOutOfRangeException(message);
      }
      this.upperBound = upperBound;
      // Create array and mark 0, 1 as not prime (True).
      primeTable = new bool[upperBound + 1];
      primeTable[0] = true;
      primeTable[1] = true;

      // Use Sieve of Eratosthenes to determine prime numbers.
      for (int ctr = START; ctr <= (int)Math.Ceiling(Math.Sqrt(upperBound));
            ctr++)
      {
         if (primeTable[ctr]) continue;

         for (int multiplier = ctr; multiplier <= upperBound / ctr; multiplier++)
            if (ctr * multiplier <= upperBound) primeTable[ctr * multiplier] = true;
      }
      // Populate array with prime number information.
      int index = START;
      while (index != -1)
      {
         index = Array.FindIndex(primeTable, index, (flag) => !flag);
         if (index >= 1)
         {
            primes.Add(index);
            index++;
         }
      }
   }

   public int[] GetAllPrimes()
   {
      return primes.ToArray();
   }

   public int[] GetPrimesFrom(int prime)
   {
      int start = primes.FindIndex((value) => value == prime);
      if (start < 0)
         throw new NotPrimeException(prime, String.Format("{0} is not a prime number.", prime));
      else
         return primes.FindAll((value) => value >= prime).ToArray();
   }
}


다음 예제에서는 두 번 GetPrimesFrom 메서드를 호출하는데, 소수가 아닌 숫자를 응용 프로그램 도메인 경계를 교차 하여 사용합니다. 두 경우 모두에서 예외가 쓰로우고 성공적으로 클라이언트 코드에서 처리 합니다.


using System;
using System.Reflection;

class Example
{
   public static void Main()
   {
      int limit = 10000000;
      PrimeNumberGenerator primes = new PrimeNumberGenerator(limit);
      int start = 1000001;
      try
      {
         int[] values = primes.GetPrimesFrom(start);
         Console.WriteLine("There are {0} prime numbers from {1} to {2}",
                           start, limit);
      }
      catch (NotPrimeException e)
      {
         Console.WriteLine("{0} is not prime", e.NonPrime);
         Console.WriteLine(e);
         Console.WriteLine("--------");
      }

      AppDomain domain = AppDomain.CreateDomain("Domain2");
      PrimeNumberGenerator gen = (PrimeNumberGenerator)domain.CreateInstanceAndUnwrap(
                                        typeof(Example).Assembly.FullName,
                                        "PrimeNumberGenerator", true,
                                        BindingFlags.Default, null,
                                        new object[] { 1000000 }, null, null);
      try
      {
         start = 100;
         Console.WriteLine(gen.GetPrimesFrom(start));
      }
      catch (NotPrimeException e)
      {
         Console.WriteLine("{0} is not prime", e.NonPrime);
         Console.WriteLine(e);
         Console.WriteLine("--------");
      }
   }
}


Windows 런타임 및.NET Framework 4.5.1

Windows 스토어 앱용 .NET 에 대 한 Windows 8, 예외는.NET Framework 아닌 스택 프레임을 통해 전파 될 때 일부 예외 정보는 일반적으로 손실 됩니다. 부터 .NET Framework 4.5.1 및 Windows 8.1, 원래 사용 하 여 공용 언어 런타임에서 계속 Exception .NET Framework 아닌 스택 프레임에서 예외를 수정 하지 않을 경우 throw 된 개체를.

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


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());
         }
   }	
}
/*
This code example produces the following results:

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

*/


.NET Framework

4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0에서 지원

.NET Framework Client Profile

4, 3.5 SP1에서 지원

이식 가능한 클래스 라이브러리

이식 가능한 클래스 라이브러리에서 지원

Windows 스토어 앱용 .NET

Windows 8에서 지원

Windows Phone 앱용 .NET

Windows Phone 8, Silverlight 8.1에서 지원

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008(서버 코어 역할은 지원되지 않음), Windows Server 2008 R2(서버 코어 역할은 SP1 이상에서 지원, Itanium은 지원되지 않음)

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

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

System.Object
  System.Exception
    Microsoft.Build.BuildEngine.InternalLoggerException
    Microsoft.Build.BuildEngine.InvalidProjectFileException
    Microsoft.Build.BuildEngine.InvalidToolsetDefinitionException
    Microsoft.Build.BuildEngine.RemoteErrorException
    Microsoft.Build.Exceptions.BuildAbortedException
    Microsoft.Build.Exceptions.InternalLoggerException
    Microsoft.Build.Exceptions.InvalidProjectFileException
    Microsoft.Build.Exceptions.InvalidToolsetDefinitionException
    Microsoft.Build.Framework.LoggerException
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException
    Microsoft.JScript.CmdLineException
    Microsoft.JScript.ParserException
    Microsoft.VisualBasic.ApplicationServices.CantStartSingleInstanceException
    Microsoft.VisualBasic.ApplicationServices.NoStartupFormException
    Microsoft.VisualBasic.Compatibility.VB6.WebClassContainingClassNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassCouldNotFindEvent
    Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemCannotBeCurrentWebItem
    Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemRespondNotFound
    Microsoft.VisualBasic.Compatibility.VB6.WebClassUserWebClassNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassWebClassFileNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassWebItemNotValid
    Microsoft.VisualBasic.Compatibility.VB6.WebItemAssociatedWebClassNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebItemClosingTagNotFound
    Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadEmbeddedResource
    Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadTemplateFile
    Microsoft.VisualBasic.Compatibility.VB6.WebItemNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebItemNoTemplateSpecified
    Microsoft.VisualBasic.Compatibility.VB6.WebItemTooManyNestedTags
    Microsoft.VisualBasic.Compatibility.VB6.WebItemUnexpectedErrorReadingTemplateFile
    Microsoft.VisualBasic.CompilerServices.IncompleteInitialization
    Microsoft.VisualBasic.CompilerServices.InternalErrorException
    Microsoft.VisualBasic.FileIO.MalformedLineException
    System.Activities.DynamicUpdate.InstanceUpdateException
    System.Activities.ExpressionParser.SourceExpressionException
    System.Activities.Expressions.LambdaSerializationException
    System.Activities.InvalidWorkflowException
    System.Activities.Presentation.Metadata.AttributeTableValidationException
    System.Activities.Statements.WorkflowTerminatedException
    System.Activities.VersionMismatchException
    System.Activities.WorkflowApplicationException
    System.AddIn.Hosting.AddInSegmentDirectoryNotFoundException
    System.AddIn.Hosting.InvalidPipelineStoreException
    System.AggregateException
    System.ApplicationException
    System.ComponentModel.Composition.CompositionContractMismatchException
    System.ComponentModel.Composition.CompositionException
    System.ComponentModel.Composition.ImportCardinalityMismatchException
    System.ComponentModel.Composition.Primitives.ComposablePartException
    System.ComponentModel.DataAnnotations.ValidationException
    System.ComponentModel.Design.ExceptionCollection
    System.Configuration.Provider.ProviderException
    System.Configuration.SettingsPropertyIsReadOnlyException
    System.Configuration.SettingsPropertyNotFoundException
    System.Configuration.SettingsPropertyWrongTypeException
    System.Data.Linq.ChangeConflictException
    System.Diagnostics.Eventing.Reader.EventLogException
    System.Diagnostics.Tracing.EventSourceException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectExistsException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException
    System.DirectoryServices.Protocols.DirectoryException
    System.IdentityModel.AsynchronousOperationException
    System.IdentityModel.Metadata.MetadataSerializationException
    System.IdentityModel.Protocols.WSTrust.WSTrustSerializationException
    System.IdentityModel.RequestException
    System.IdentityModel.Selectors.CardSpaceException
    System.IdentityModel.Selectors.IdentityValidationException
    System.IdentityModel.Selectors.PolicyValidationException
    System.IdentityModel.Selectors.ServiceBusyException
    System.IdentityModel.Selectors.ServiceNotStartedException
    System.IdentityModel.Selectors.StsCommunicationException
    System.IdentityModel.Selectors.UnsupportedPolicyOptionsException
    System.IdentityModel.Selectors.UntrustedRecipientException
    System.IdentityModel.Selectors.UserCancellationException
    System.IdentityModel.Services.AsynchronousOperationException
    System.IdentityModel.Services.FederatedAuthenticationSessionEndingException
    System.IdentityModel.Services.FederationException
    System.IdentityModel.Services.WSFederationMessageException
    System.InvalidTimeZoneException
    System.IO.IsolatedStorage.IsolatedStorageException
    System.IO.Log.SequenceFullException
    System.Management.Instrumentation.InstrumentationBaseException
    System.Management.Instrumentation.WmiProviderInstallationException
    System.Net.Http.HttpRequestException
    System.Net.Mail.SmtpException
    System.Net.PeerToPeer.PeerToPeerException
    System.Runtime.CompilerServices.RuntimeWrappedException
    System.Runtime.DurableInstancing.InstancePersistenceException
    System.Runtime.Remoting.MetadataServices.SUDSGeneratorException
    System.Runtime.Remoting.MetadataServices.SUDSParserException
    System.Runtime.Serialization.InvalidDataContractException
    System.Security.RightsManagement.RightsManagementException
    System.ServiceModel.Channels.InvalidChannelBindingException
    System.SystemException
    System.Threading.BarrierPostPhaseException
    System.Threading.LockRecursionException
    System.Threading.Tasks.TaskSchedulerException
    System.TimeZoneNotFoundException
    System.Web.Query.Dynamic.ParseException
    System.Web.Security.MembershipCreateUserException
    System.Web.Security.MembershipPasswordException
    System.Web.UI.ViewStateException
    System.Web.UI.WebControls.EntityDataSourceValidationException
    System.Web.UI.WebControls.LinqDataSourceValidationException
    System.Windows.Automation.NoClickablePointException
    System.Windows.Automation.ProxyAssemblyNotLoadedException
    System.Windows.Controls.PrintDialogException
    System.Windows.Forms.AxHost.InvalidActiveXStateException
    System.Windows.Xps.XpsException
    System.Windows.Xps.XpsWriterException
    System.Workflow.Activities.Rules.RuleException
    System.Workflow.ComponentModel.Compiler.WorkflowValidationFailedException
    System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException
    System.Workflow.ComponentModel.WorkflowTerminatedException
    System.Workflow.Runtime.WorkflowOwnershipException
    System.Xaml.XamlException

커뮤니티 추가 항목

추가
Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft