Exception Class

정의

응용 프로그램을 실행할 때 나타나는 오류를 나타냅니다. Represents errors that occur during application execution.

[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[Serializable]
public class Exception : System.Runtime.InteropServices._Exception, System.Runtime.Serialization.ISerializable
상속
Exception
파생
특성
구현

예제

다음 예제는 catch 처리 하도록 정의 된 블록 ArithmeticException 오류입니다.The following example demonstrates a catch block that is defined to handle ArithmeticException errors. catch catch 블록도 DivideByZeroException 오류 때문에 DivideByZeroException 에서 파생 ArithmeticException 되며 없습니다 catch 블록에 대해 명시적으로 정의 된 DivideByZeroException 오류입니다.This catch block also catches DivideByZeroException errors, because DivideByZeroException derives from ArithmeticException and there is no catch block explicitly defined for DivideByZeroException errors.

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

ArithmeticException Handler: System.DivideByZeroException: Attempted to divide by zero.
   at main()
 
*/
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()

*/
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
'
'This code example produces the following results:
'
'ArithmeticException Handler: System.OverflowException: Arithmetic operation resulted in an overflow.
'   at ExceptionTestClass.Main()
'

설명

이 클래스는 모든 예외에 대 한 기본 클래스입니다.This class is the base class for all exceptions. 오류가 발생 하는 시스템 또는 현재 실행 중인 응용 프로그램 오류에 대 한 정보를 포함 하는 예외를 throw 하 여 보고 합니다.When an error occurs, either the system or the currently executing application reports it by throwing an exception that contains information about the error. 예외가 throw 되 면 응용 프로그램에서 또는 기본 예외 핸들러에서 처리 됩니다.After an exception is thrown, it is handled by the application or by the default exception handler.

섹션 내용In this section:

오류 및 예외 Errors and exceptions
Try/catch 블록 Try/catch blocks
예외 형식 기능 Exception type features
예외 클래스 속성 Exception class properties
성능 고려 사항 Performance considerations
예외 다시 throw Re-throwing an exception
표준 예외를 선택합니다. Choosing standard exceptions
사용자 지정 예외를 구현합니다.Implementing custom exceptions

오류 및 예외Errors and exceptions

런타임 오류는 다양 한 이유로 발생할 수 있습니다.Run-time errors can occur for a variety of reasons. 그러나 일부 오류 코드에서 예외로 처리 되어야 합니다.However, not all errors should be handled as exceptions in your code. 적절 하 게 응답할 수 런타임에 발생할 수 있는 오류의 몇 가지 범주는 다음과 같습니다.Here are some categories of errors that can occur at run time and the appropriate ways to respond to them.

  • 사용 오류입니다.Usage errors. 사용 오류를 예외가 발생할 수 있는 프로그램 논리에서 오류를 나타냅니다.A usage error represents an error in program logic that can result in an exception. 그러나 예외 처리를 통해 없습니다 있지만 잘못 된 코드를 수정 하 여 오류를 해결 해야 합니다.However, the error should be addressed not through exception handling but by modifying the faulty code. 예를 들어 재정의는 Object.Equals(Object) 가정 다음 예제에서 메서드는 obj 인수에 null이 아닌 여야 합니다.For example, the override of the Object.Equals(Object) method in the following example assumes that the obj argument must always be non-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));   
       }
    }
    
    Public Class Person
       Private _name As String
       
       Public Property Name As String
          Get
             Return _name
          End Get
          Set
             _name = value
          End Set
       End Property
       
       Public Overrides Function Equals(obj As Object) As Boolean
          ' This implementation contains an error in program logic:
          ' It assumes that the obj argument is not null.
          Dim p As Person = CType(obj, Person)
          Return Me.Name.Equals(p.Name)
       End Function
    End Class
    
    Module Example
       Public Sub Main()
          Dim p1 As New Person()
          p1.Name = "John"
          Dim p2 As Person = Nothing
          
          ' The following throws a NullReferenceException.
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2))   
       End Sub
    End Module
    

    NullReferenceException 발생 하는 예외 때 objnull 명시적으로 호출 하기 전에 null 인지 테스트할 소스 코드를 수정 하 여 제거할 수 있습니다는 Object.Equals 재정의 및 다시 컴파일입니다.The NullReferenceException exception that results when obj is null can be eliminated by modifying the source code to explicitly test for null before calling the Object.Equals override and then re-compiling. 다음 예제에서는 처리 하는 수정 된 소스 코드를 포함 한 null 인수입니다.The following example contains the corrected source code that handles a null argument.

    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
    
    Public Class Person
       Private _name As String
       
       Public Property Name As String
          Get
             Return _name
          End Get
          Set
             _name = value
          End Set
       End Property
       
       Public Overrides Function Equals(obj As Object) As Boolean
          ' This implementation handles a null obj argument.
          Dim p As Person = TryCast(obj, Person)
          If p Is Nothing Then 
             Return False
          Else
             Return Me.Name.Equals(p.Name)
          End If
       End Function
    End Class
    
    Module Example
       Public Sub Main()
          Dim p1 As New Person()
          p1.Name = "John"
          Dim p2 As Person = Nothing
          
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2))   
       End Sub
    End Module
    ' The example displays the following output:
    '       p1 = p2: False
    

    예외 사용 오류에 대 한 처리를 사용 하는 대신 사용할 수는 Debug.Assert 디버그 빌드에서 사용 오류를 식별 하는 방법 및 Trace.Assert 디버그와 릴리스 사용 오류를 식별 하는 메서드를 작성 합니다.Instead of using exception handling for usage errors, you can use the Debug.Assert method to identify usage errors in debug builds, and the Trace.Assert method to identify usage errors in both debug and release builds. 자세한 내용은 관리 코드에 어설션합니다.For more information, see Assertions in Managed Code.

  • 프로그램 오류가 발생 했습니다.Program errors. 프로그램 오류에는 반드시 버그 없는 코드를 작성 하 여 방지할 수 없는 런타임 오류가입니다.A program error is a run-time error that cannot necessarily be avoided by writing bug-free code.

    일부 경우에 프로그램 오류는 예상 또는 일상적인 오류 조건이 반영할 수 있습니다.In some cases, a program error may reflect an expected or routine error condition. 이 경우 다음 예외 처리를 사용 하 여 프로그램 오류를 처리 하 고 대신 작업을 다시 시도를 방지 하는 것이 좋습니다.In this case, you may want to avoid using exception handling to deal with the program error and instead retry the operation. 예를 들어, 사용자는 특정 형식으로 날짜를 입력 해야 하는 경우 구문 분석할 수 있습니다 날짜 문자열을 호출 하 여 합니다 DateTime.TryParseExact 반환 하는 메서드를 Boolean 구문 분석 작업이 성공 했는지를 나타내는, 합니다 사용하는대신값DateTime.ParseExactthrow 하는 메서드를 FormatException 날짜 문자열을 변환할 수 없는 경우 예외를 DateTime 값입니다.For example, if the user is expected to input a date in a particular format, you can parse the date string by calling the DateTime.TryParseExact method, which returns a Boolean value that indicates whether the parse operation succeeded, instead of using the DateTime.ParseExact method, which throws a FormatException exception if the date string cannot be converted to a DateTime value. 마찬가지로, 사용자가 존재 하지 않는 파일을 열고 하려고 하는 경우 먼저 호출 된 File.Exists 여부 파일 존재 하 고 확인을 하지 않는 경우 사용자 만드시겠습니까 하려고 하는지 여부를 확인 하는 방법.Similarly, if a user tries to open a file that does not exist, you can first call the File.Exists method to check whether the file exists and, if it does not, prompt the user whether he or she wants to create it.

    다른 경우에 프로그램 오류 코드에서 처리할 수 있는 예기치 않은 오류 조건을 반영 합니다.In other cases, a program error reflects an unexpected error condition that can be handled in your code. 예를 들어 파일이 있는지 확인 하려면를 선택한 경우에이 삭제 될 수 있습니다를 열 수 있도록 전이나 손상 되었을 수 있습니다.For example, even if you've checked to ensure that a file exists, it may be deleted before you can open it, or it may be corrupted. 인스턴스화하여 파일을 열려고 할 경우는 StreamReader 개체나 호출 합니다 Open 메서드가 throw 할 수 있습니다는 FileNotFoundException 예외입니다.In that case, trying to open the file by instantiating a StreamReader object or calling the Open method may throw a FileNotFoundException exception. 이러한 경우에 오류를 복구 하는 예외 처리를 사용 해야 합니다.In these cases, you should use exception handling to recover from the error.

  • 시스템 오류입니다.System failures. 시스템 오류에 의미 있는 방식으로 프로그래밍 방식으로 처리할 수 없는 런타임 오류입니다.A system failure is a run-time error that cannot be handled programmatically in a meaningful way. 예를 들어, 모든 메서드가 throw 할 수는 OutOfMemoryException 공용 언어 런타임에서 추가 메모리를 할당할 수 없는 경우 예외입니다.For example, any method can throw an OutOfMemoryException exception if the common language runtime is unable to allocate additional memory. 일반적으로 시스템 오류 예외 처리를 사용 하 여 처리 되지 않습니다.Ordinarily, system failures are not handled by using exception handling. 대신,와 같은 이벤트를 사용할 수 있습니다 AppDomain.UnhandledException 호출을 Environment.FailFast 예외 정보를 기록 하 고 응용 프로그램을 종료 하기 전에 실패의 사용자에 게 알릴 방법입니다.Instead, you may be able to use an event such as AppDomain.UnhandledException and call the Environment.FailFast method to log exception information and notify the user of the failure before the application terminates.

Try/catch 블록Try/catch blocks

공용 언어 런타임 예외 개체의 표현 및 프로그램 코드 및 예외 처리 코드를 분리를 기반으로 하는 예외 처리 모델을 제공 try 블록 및 catch 블록입니다.The common language runtime provides an exception handling model that is based on the representation of exceptions as objects, and the separation of program code and exception handling code into try blocks and catch blocks. 하나 이상의 수 catch 각각은 특정 형식의 예외 또는 다른 블록 보다 구체적인 예외를 catch 하는 데 사용 하기 위한 처리 차단 합니다.There can be one or more catch blocks, each designed to handle a particular type of exception, or one block designed to catch a more specific exception than another block.

내 코드에 존재 해야 응용 프로그램의 응용 프로그램 코드 블록을 실행 하는 동안 발생 하는 예외를 처리 하는 경우는 try 문 이라고는 try 블록입니다.If an application handles exceptions that occur during the execution of a block of application code, the code must be placed within a try statement and is called a try block. throw 된 예외를 처리 하는 응용 프로그램 코드를 try 블록 내에 배치 됩니다는 catch 문 라고는 catch 블록입니다.Application code that handles exceptions thrown by a try block is placed within a catch statement and is called a catch block. 0 개 이상의 catch 와 연결 된 블록을 try 블록 및 각 catch 블록을 처리 하는 예외의 형식을 결정 하는 형식 필터를 포함 합니다.Zero or more catch blocks are associated with a try block, and each catch block includes a type filter that determines the types of exceptions it handles.

예외가 발생 하는 경우는 try 블록에 시스템 연결 된 검색 catch 블록을 찾을 때까지 응용 프로그램 코드에 나타나는 순서에는 catch 예외를 처리 하는 블록입니다.When an exception occurs in a try block, the system searches the associated catch blocks in the order they appear in application code, until it locates a catch block that handles the exception. A catch 형식의 예외를 처리 하는 블록 T catch 블록의 형식 필터를 지정 하는 경우 T 있는 모든 형식이 또는 T 에서 파생 됩니다.A catch block handles an exception of type T if the type filter of the catch block specifies T or any type that T derives from. 시스템 중지 후 첫 번째를 찾으면 검색 catch 예외를 처리 하는 블록입니다.The system stops searching after it finds the first catch block that handles the exception. 이러한 이유로 응용 프로그램 코드를 catch 전에 형식을 처리 하는 블록을 지정 해야 합니다는 catch 이 섹션에 나오는 예제에서 설명한 것 처럼 해당 기본 형식으로 처리 하는 블록.For this reason, in application code, a catch block that handles a type must be specified before a catch block that handles its base types, as demonstrated in the example that follows this section. 처리 하는 catch 블록 System.Exception 마지막에 지정 됩니다.A catch block that handles System.Exception is specified last.

없으면를 catch 현재 연결 된 블록 try 블록에서 예외를 및 현재 처리 try 내 다른 블록에 중첩 try 현재 호출에서 차단는 catch 다음와 연결 된 블록 바깥쪽 try 블록 검색 됩니다.If none of the catch blocks associated with the current try block handle the exception, and the current try block is nested within other try blocks in the current call, the catch blocks associated with the next enclosing try block are searched. 없으면 catch 예외에 대 한 블록을 찾지 못하면, 시스템은 현재 호출의 이전 중첩 수준을 검색 합니다.If no catch block for the exception is found, the system searches previous nesting levels in the current call. 없으면 catch 차단 예외가 있으면 현재 호출, 예외 호출 스택 위로 전달 됩니다 및은 이전 스택 프레임 검색 되는 catch 예외를 처리 하는 블록입니다.If no catch block for the exception is found in the current call, the exception is passed up the call stack, and the previous stack frame is searched for a catch block that handles the exception. 호출 스택 검색에는 예외를 처리 하거나 호출 스택에서 더 이상의 프레임이 없을 때까지 계속 됩니다.The search of the call stack continues until the exception is handled or until no more frames exist on the call stack. 찾지 못한 채 호출 스택의 위쪽에 도달 하면는 catch 기본 예외 핸들러가 예외를 처리 하는 블록을 처리 하 고 응용 프로그램을 종료 합니다.If the top of the call stack is reached without finding a catch block that handles the exception, the default exception handler handles it and the application terminates.

예외 형식 기능Exception type features

예외 형식에는 다음 기능을 지원 합니다.Exception types support the following features:

  • 오류를 설명 하는 사람이 읽을 수 있는 텍스트입니다.Human-readable text that describes the error. 런타임은 예외가 발생 하면 문제를 해결 하는 오류의 특성의 사용자에 게 알려 및 작업을 제안 사용 가능한 텍스트 메시지입니다.When an exception occurs, the runtime makes a text message available to inform the user of the nature of the error and to suggest action to resolve the problem. 이 텍스트 메시지에 보유 됩니다는 Message 예외 개체의 속성입니다.This text message is held in the Message property of the exception object. 예외 개체를 만드는 동안 해당 특정 예외의 세부 정보를 설명 하는 생성자를 텍스트 문자열을 전달할 수 있습니다.During the creation of the exception object, you can pass a text string to the constructor to describe the details of that particular exception. 오류 메시지 인수가 없을 생성자에 제공 하면 기본 오류 메시지 사용 됩니다.If no error message argument is supplied to the constructor, the default error message is used. 자세한 내용은 Message 속성을 참조하세요.For more information, see the Message property.

  • 예외가 throw 되었을 때 호출 스택의 상태입니다.The state of the call stack when the exception was thrown. StackTrace 속성은 코드에서 오류가 발생 하는 위치를 결정 하는 스택 추적을 제공 합니다.The StackTrace property carries a stack trace that can be used to determine where the error occurs in the code. 스택 추적 호출된 되는 모든 메서드가 및 호출이 수행 되는 소스 파일의 줄 번호를 나열 합니다.The stack trace lists all the called methods and the line numbers in the source file where the calls are made.

예외 클래스 속성Exception class properties

Exception 클래스에는 다양 한 코드 위치, 유형, 도움말 파일 및 예외에 대 한 이유를 식별 하는 속성이 포함 되어 있습니다.: StackTraceInnerException, MessageHelpLinkHResult, Source, TargetSite, 및 Data합니다.The Exception class includes a number of properties that help identify the code location, the type, the help file, and the reason for the exception: StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite, and Data.

두 개 이상의 예외와 인과 관계에 있는 경우는 InnerException 속성은이 정보를 유지 합니다.When a causal relationship exists between two or more exceptions, the InnerException property maintains this information. 이 내부 예외에 대 한 응답에서 외부 예외가 발생 합니다.The outer exception is thrown in response to this inner exception. 외부 예외를 처리 하는 코드 이전 내부 예외의 정보를 사용 하 여 오류를 보다 적절 하 게 처리할 수 있습니다.The code that handles the outer exception can use the information from the earlier inner exception to handle the error more appropriately. 키/값 쌍의 컬렉션인 예외에 대 한 보충 정보를 저장할 수 있습니다는 Data 속성입니다.Supplementary information about the exception can be stored as a collection of key/value pairs in the Data property.

예외 개체를 만드는 동안 생성자에 전달 되는 오류 메시지 문자열을 지역화 해야 하 고 사용 하 여 리소스 파일에서 지정할 수는 ResourceManager 클래스입니다.The error message string that is passed to the constructor during the creation of the exception object should be localized and can be supplied from a resource file by using the ResourceManager class. 지역화 된 리소스에 대 한 자세한 내용은 참조는 위성 어셈블리 만들기 하 고 리소스 패키징 및 배포 항목입니다.For more information about localized resources, see the Creating Satellite Assemblies and Packaging and Deploying Resources topics.

예외 발생 원인을 하는 방법에 대 한 광범위 한 정보를 사용 하 여 사용자를 제공 하는 HelpLink 속성이 도움말 파일 URL (또는 URN)를 포함할 수 있습니다.To provide the user with extensive information about why the exception occurred, the HelpLink property can hold a URL (or URN) to a help file.

Exception 클래스 값 0x80131500 HRESULT COR_E_EXCEPTION를 사용 합니다.The Exception class uses the HRESULT COR_E_EXCEPTION, which has the value 0x80131500.

인스턴스의 초기 속성 값의 목록을 합니다 Exception 클래스를 참조 하십시오는 Exception 생성자입니다.For a list of initial property values for an instance of the Exception class, see the Exception constructors.

성능 고려 사항Performance considerations

Throw 되거나 예외를 처리는 상당한 양의 시스템 리소스 및 실행 시간을 소비 합니다.Throwing or handling an exception consumes a significant amount of system resources and execution time. 예측 가능한 이벤트를 처리 또는 흐름 제어 정말 비정상적인 상태를 처리에 예외를 throw 합니다.Throw exceptions only to handle truly extraordinary conditions, not to handle predictable events or flow control. 예를 들어, 클래스 라이브러리를 개발 하는 경우와 같은 일부 경우에서 하다 메서드 인수를 유효 하지 않은 경우, 올바른 매개 변수를 사용 하 여 호출할 메서드를 기대 하기 때문에 예외를 throw 합니다.For example, in some cases, such as when you're developing a class library, it's reasonable to throw an exception if a method argument is invalid, because you expect your method to be called with valid parameters. 잘못 된 메서드 인수로 사용 오류를의 결과가 아닌 경우 경우에 특별 한 문제가 발생 했음을 의미 합니다.An invalid method argument, if it is not the result of a usage error, means that something extraordinary has occurred. 반대로, 사용자 입력 유효 하지 않은 경우, 종종 잘못 된 데이터를 입력 하는 작업을 할 수 있으므로 예외를 throw 하지 않습니다.Conversely, do not throw an exception if user input is invalid, because you can expect users to occasionally enter invalid data. 대신, 유효한 입력을 입력할 수 있도록 재시도 메커니즘을 제공 합니다.Instead, provide a retry mechanism so users can enter valid input. 또는 사용 오류를 처리 하려면 예외를 사용 해야 합니다.Nor should you use exceptions to handle usage errors. 대신 어설션을 식별 하 고 사용 오류를 수정 합니다.Instead, use assertions to identify and correct usage errors.

반환 코드를; 충분 한 경우 예외를 throw 하지 않는 또한 예외가; 반환 코드를 변환 하지 않습니다 수행 하지 정기적으로 catch 예외, 무시 및 다음 처리를 계속 합니다.In addition, do not throw an exception when a return code is sufficient; do not convert a return code to an exception; and do not routinely catch an exception, ignore it, and then continue processing.

예외 다시 throwRe-throwing an exception

에서는 대부분의 경우 예외 처리기 단순히가 호출자에 게는 예외를 전달 합니다.In many cases, an exception handler simply wants to pass the exception on to the caller. 이 대부분에서 자주 발생 합니다.This most often occurs in:

  • 클래스 라이브러리를.NET Framework 클래스 라이브러리 또는 다른 클래스 라이브러리의 메서드 호출을 래핑합니다.A class library that in turn wraps calls to methods in the .NET Framework class library or other class libraries.

  • 응용 프로그램 또는 심각한 예외를 발생 하는 라이브러리입니다.An application or library that encounters a fatal exception. 예외 처리기는 예외를 기록 하 고 예외 다시 throw 할 수 있습니다.The exception handler can log the exception and then re-throw the exception.

다시 예외를 throw 하는 권장된 방법은 사용 하기만 하면 되는 throw C#의 문은 하며 Throw 식을 포함 하지 않고 Visual Basic의 문입니다.The recommended way to re-throw an exception is to simply use the throw statement in C# and the Throw statement in Visual Basic without including an expression. 이렇게 하면 호출자에 게 예외 전파 될 때 모든 호출 스택 정보가 유지 합니다.This ensures that all call stack information is preserved when the exception is propagated to the caller. 다음은 이에 대한 예입니다.The following example illustrates this. 문자열 확장 메서드를 FindOccurrences에 대 한 하나 이상의 호출을 래핑합니다 String.IndexOf(String, Int32) 미리 인수 유효성 검사 없이 합니다.A string extension method, FindOccurrences, wraps one or more calls to String.IndexOf(String, Int32) without validating its arguments beforehand.

using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

public static class Library
{
   public static int[] FindOccurrences(this String s, String f)
   {
      var indexes = new List<int>();
      int currentIndex = 0;
      try {
         while (currentIndex >= 0 && currentIndex < s.Length) {
            currentIndex = s.IndexOf(f, currentIndex);
            if (currentIndex >= 0) {
               indexes.Add(currentIndex);
               currentIndex++;
            }
         }
      }
      catch (ArgumentNullException e) {
         // Perform some action here, such as logging this exception.

         throw;
      }
      return indexes.ToArray();
   }
}
Imports System.Collections.Generic
Imports System.Runtime.CompilerServices

Public Module Library
   <Extension()>
   Public Function FindOccurrences(s As String, f As String) As Integer()
      Dim indexes As New List(Of Integer)
      Dim currentIndex As Integer = 0
      Try
         Do While currentIndex >= 0 And currentIndex < s.Length
            currentIndex = s.IndexOf(f, currentIndex)
            If currentIndex >= 0 Then
               indexes.Add(currentIndex)
               currentIndex += 1
            End If
         Loop
      Catch e As ArgumentNullException
         ' Perform some action here, such as logging this exception.
         
         Throw
      End Try
      Return indexes.ToArray()
   End Function
End Module

호출자가 호출 FindOccurrences 두 번입니다.A caller then calls FindOccurrences twice. 두 번째 호출에서 FindOccurrences를 호출자에 게 전달을 null 사례 검색 문자열로 합니다 String.IndexOf(String, Int32) throw 하는 방법은 ArgumentNullException 예외입니다.In the second call to FindOccurrences, the caller passes a null as the search string, which cases the String.IndexOf(String, Int32) method to throw an ArgumentNullException exception. 이 예외를 처리 하는 FindOccurrences 메서드와 호출자에 게 다시 전달된 합니다.This exception is handled by the FindOccurrences method and passed back to the caller. Throw 문 식 없이 사용 되므로 호출 스택을 유지 됩니다 예제의 출력이 보여 줍니다.Because the throw statement is used with no expression, the output from the example shows that the call stack is preserved.

public class Example
{
   public static void Main()
   {
      String s = "It was a cold day when...";
      int[] indexes = s.FindOccurrences("a");
      ShowOccurrences(s, "a", indexes);
      Console.WriteLine();
      
      String toFind = null;
      try {
         indexes = s.FindOccurrences(toFind);
         ShowOccurrences(s, toFind, indexes);
      }
      catch (ArgumentNullException e) {
         Console.WriteLine("An exception ({0}) occurred.",
                           e.GetType().Name);
         Console.WriteLine("Message:\n   {0}\n", e.Message);
         Console.WriteLine("Stack Trace:\n   {0}\n", e.StackTrace);
      }
   }

   private static void ShowOccurrences(String s, String toFind, int[] indexes)
   {
      Console.Write("'{0}' occurs at the following character positions: ",
                    toFind);
      for (int ctr = 0; ctr < indexes.Length; ctr++)
         Console.Write("{0}{1}", indexes[ctr],
                       ctr == indexes.Length - 1 ? "" : ", ");

      Console.WriteLine();
   }
}
// The example displays the following output:
//    'a' occurs at the following character positions: 4, 7, 15
//
//    An exception (ArgumentNullException) occurred.
//    Message:
//       Value cannot be null.
//    Parameter name: value
//
//    Stack Trace:
//          at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
//    ngComparison comparisonType)
//       at Library.FindOccurrences(String s, String f)
//       at Example.Main()
Module Example
   Public Sub Main()
      Dim s As String = "It was a cold day when..."
      Dim indexes() As Integer = s.FindOccurrences("a")
      ShowOccurrences(s, "a", indexes)
      Console.WriteLine()

      Dim toFind As String = Nothing
      Try
         indexes = s.FindOccurrences(toFind)
         ShowOccurrences(s, toFind, indexes)
      Catch e As ArgumentNullException
         Console.WriteLine("An exception ({0}) occurred.",
                           e.GetType().Name)
         Console.WriteLine("Message:{0}   {1}{0}", vbCrLf, e.Message)
         Console.WriteLine("Stack Trace:{0}   {1}{0}", vbCrLf, e.StackTrace)
      End Try
   End Sub
   
   Private Sub ShowOccurrences(s As String, toFind As String, indexes As Integer())
      Console.Write("'{0}' occurs at the following character positions: ",
                    toFind)
      For ctr As Integer = 0 To indexes.Length - 1
         Console.Write("{0}{1}", indexes(ctr),
                       If(ctr = indexes.Length - 1, "", ", "))
      Next
      Console.WriteLine()
   End Sub
End Module
' The example displays the following output:
'    'a' occurs at the following character positions: 4, 7, 15
'
'    An exception (ArgumentNullException) occurred.
'    Message:
'       Value cannot be null.
'    Parameter name: value
'
'    Stack Trace:
'          at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
'    ngComparison comparisonType)
'       at Library.FindOccurrences(String s, String f)
'       at Example.Main()

반대로, 사용 하 여 다시 예외가 발생 합니다In contrast, if the exception is re-thrown by using the

throw e  
Throw e  

문, 전체 호출 스택을 유지 되지 및 예제에서는 다음과 같은 출력이 생성 됩니다.statement, the full call stack is not preserved, and the example would generate the following output:


'a' occurs at the following character positions: 4, 7, 15  

An exception (ArgumentNullException) occurred.  
Message:  
   Value cannot be null.  
Parameter name: value  

Stack Trace:  
      at Library.FindOccurrences(String s, String f)  
   at Example.Main()  

다소 번거로운 방법은 새 예외를 throw 하는 데 내부 예외가 원래 예외의 호출 스택 정보를 유지 합니다.A slightly more cumbersome alternative is to throw a new exception, and to preserve the original exception's call stack information in an inner exception. 호출자에 게 새 예외를 사용할 수 있습니다 InnerException 스택 프레임 및 원래 예외에 대 한 기타 정보를 검색할 속성입니다.The caller can then use the new exception's InnerException property to retrieve stack frame and other information about the original exception. 이 경우에 throw 문을 다음과 같습니다.In this case, the throw statement is:

throw new ArgumentNullException("You must supply a search string.",
                                e);
Throw New ArgumentNullException("You must supply a search string.",
                                e)

알고 있어야 하는 예외를 처리 하는 사용자 코드에는 InnerException 다음 예외 처리기에서 볼 수 있듯이 속성 원래 예외에 대 한 정보를 포함 합니다.The user code that handles the exception has to know that the InnerException property contains information about the original exception, as the following exception handler illustrates.

try {
   indexes = s.FindOccurrences(toFind);
   ShowOccurrences(s, toFind, indexes);
}
catch (ArgumentNullException e) {
   Console.WriteLine("An exception ({0}) occurred.",
                     e.GetType().Name);
   Console.WriteLine("   Message:\n{0}", e.Message);
   Console.WriteLine("   Stack Trace:\n   {0}", e.StackTrace);
   Exception ie = e.InnerException;
   if (ie != null) {
      Console.WriteLine("   The Inner Exception:");
      Console.WriteLine("      Exception Name: {0}", ie.GetType().Name);
      Console.WriteLine("      Message: {0}\n", ie.Message);
      Console.WriteLine("      Stack Trace:\n   {0}\n", ie.StackTrace);
   }
}
// The example displays the following output:
//    'a' occurs at the following character positions: 4, 7, 15
//
//    An exception (ArgumentNullException) occurred.
//       Message: You must supply a search string.
//
//       Stack Trace:
//          at Library.FindOccurrences(String s, String f)
//       at Example.Main()
//
//       The Inner Exception:
//          Exception Name: ArgumentNullException
//          Message: Value cannot be null.
//    Parameter name: value
//
//          Stack Trace:
//          at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
//    ngComparison comparisonType)
//       at Library.FindOccurrences(String s, String f)
Try
   indexes = s.FindOccurrences(toFind)
   ShowOccurrences(s, toFind, indexes)
Catch e As ArgumentNullException
   Console.WriteLine("An exception ({0}) occurred.",
                     e.GetType().Name)
   Console.WriteLine("   Message: {1}{0}", vbCrLf, e.Message)
   Console.WriteLine("   Stack Trace:{0}   {1}{0}", vbCrLf, e.StackTrace)
   Dim ie As Exception = e.InnerException
   If ie IsNot Nothing Then
      Console.WriteLine("   The Inner Exception:")
      Console.WriteLine("      Exception Name: {0}", ie.GetType().Name)
      Console.WriteLine("      Message: {1}{0}", vbCrLf, ie.Message)
      Console.WriteLine("      Stack Trace:{0}   {1}{0}", vbCrLf, ie.StackTrace)
   End If
End Try
' The example displays the following output:
'       'a' occurs at the following character positions: 4, 7, 15
'
'       An exception (ArgumentNullException) occurred.
'          Message: You must supply a search string.
'
'          Stack Trace:
'             at Library.FindOccurrences(String s, String f)
'          at Example.Main()
'
'          The Inner Exception:
'             Exception Name: ArgumentNullException
'             Message: Value cannot be null.
'       Parameter name: value
'
'             Stack Trace:
'             at System.String.IndexOf(String value, Int32 startIndex, Int32 count, Stri
'       ngComparison comparisonType)
'          at Library.FindOccurrences(String s, String f)

표준 예외를 선택합니다.Choosing standard exceptions

예외를 throw 하는 경우 사용자 지정 예외를 구현 하는 대신.NET Framework의 기존 예외 형식을 자주 사용할 수 있습니다.When you have to throw an exception, you can often use an existing exception type in the .NET Framework instead of implementing a custom exception. 이러한 두 가지 조건에 표준 예외 형식을 사용 해야 합니다.You should use a standard exception type under these two conditions:

  • 사용 현황 오류로 인해 발생 하는 예외를 throw 하는 (즉, 메서드를 호출 하는 개발자가 변경한 프로그램 논리의 오류로 인해).You are throwing an exception that is caused by a usage error (that is, by an error in program logic made by the developer who is calling your method). 일반적으로 예외를 throw 할와 같은 ArgumentException, ArgumentNullExceptionInvalidOperationException, 또는 NotSupportedException합니다.Typically, you would throw an exception such as ArgumentException, ArgumentNullException, InvalidOperationException, or NotSupportedException. 예외 개체를 인스턴스화하는 오류를 설명 개발자가 문제를 해결할 수 있도록 하는 경우 예외 개체의 생성자에 제공 하는 문자열입니다.The string you supply to the exception object's constructor when instantiating the exception object should describe the error so that the developer can fix it. 자세한 내용은 Message 속성을 참조하세요.For more information, see the Message property.

  • 기존.NET Framework 예외를 사용 하 여 호출자에 게 전달 될 수 있는 오류를 처리 하는 합니다.You are handling an error that can be communicated to the caller with an existing .NET Framework exception. 가능 하면 가장 많이 파생 된 예외를 throw 해야 합니다.You should throw the most derived exception possible. 예를 들어 메서드 인수로 열거형의 유효한 멤버에 필요한 경우 throw 해야는 InvalidEnumArgumentException (가장 클래스를 파생 하는 데 사용) 아닌 ArgumentException합니다.For example, if a method requires an argument to be a valid member of an enumeration type, you should throw an InvalidEnumArgumentException (the most derived class) rather than an ArgumentException.

다음 표에서 일반적인 예외 형식과 되는 사용자가 throw 할 조건을 나열 합니다.The following table lists common exception types and the conditions under which you would throw them.

예외Exception 조건Condition
ArgumentException 메서드에 전달 되는 null이 아닌 인수가 올바르지 않습니다.A non-null argument that is passed to a method is invalid.
ArgumentNullException 메서드에 전달 되는 인수가 null합니다.An argument that is passed to a method is null.
ArgumentOutOfRangeException 인수가 유효한 값의 범위를 벗어납니다.An argument is outside the range of valid values.
DirectoryNotFoundException 디렉터리 경로의 앞쪽 부분은 올바르지 않습니다.Part of a directory path is not valid.
DivideByZeroException 정수는 분모 또는 Decimal 나누기 작업은 0입니다.The denominator in an integer or Decimal division operation is zero.
DriveNotFoundException 드라이브를 사용할 수 없거나 존재 하지 않습니다.A drive is unavailable or does not exist.
FileNotFoundException 파일이 존재 하지 않습니다.A file does not exist.
FormatException 값을 변환할 문자열에서 변환 메서드 같은 적절 한 형식이 아닙니다. Parse합니다.A value is not in an appropriate format to be converted from a string by a conversion method such as Parse.
IndexOutOfRangeException 인덱스 배열 또는 컬렉션의 범위를 벗어납니다.An index is outside the bounds of an array or collection.
InvalidOperationException 메서드 호출이 개체의 현재 상태에서 올바르지 않습니다.A method call is invalid in an object's current state.
KeyNotFoundException 컬렉션의 멤버에 액세스 하는 것에 대 한 지정된 된 키를 찾을 수 없습니다.The specified key for accessing a member in a collection cannot be found.
NotImplementedException 메서드 또는 연산이 구현 되지 됩니다.A method or operation is not implemented.
NotSupportedException 메서드 또는 작업이 지원 되지 않습니다.A method or operation is not supported.
ObjectDisposedException 삭제 된 개체에는 작업이 수행 됩니다.An operation is performed on an object that has been disposed.
OverflowException 산술, 캐스팅 또는 변환 작업 결과로 오버플로가 발생 합니다.An arithmetic, casting, or conversion operation results in an overflow.
PathTooLongException 경로나 파일 이름에는 시스템 정의 최대 길이 초과합니다.A path or file name exceeds the maximum system-defined length.
PlatformNotSupportedException 작업은 현재 플랫폼에서 지원 되지 않습니다.The operation is not supported on the current platform.
RankException 차원 수가 잘못 된 배열은 메서드에 전달 됩니다.An array with the wrong number of dimensions is passed to a method.
TimeoutException 작업에 할당 된 시간 간격이 만료 되었습니다.The time interval allotted to an operation has expired.
UriFormatException 잘못 된 리소스 URI (Uniform Identifier)가 사용 됩니다.An invalid Uniform Resource Identifier (URI) is used.

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

다음 경우는 오류 조건을 처리 하기 위해 기존.NET Framework 예외를 사용 하 여 적합 하지 않습니다.In the following cases, using an existing .NET Framework exception to handle an error condition is not adequate:

  • 경우 예외는 기존.NET Framework 예외를 매핑할 수 없는 고유한 프로그램 오류를 반영 합니다.When the exception reflects a unique program error that cannot be mapped to an existing .NET Framework exception.

  • 예외는 기존.NET Framework 예외 나 예외에 대 한 적절 한 처리와에서 다르면 처리가 필요한 경우에 유사한 예외가에서 명확히 구분 해야 합니다.When the exception requires handling that is different from the handling that is appropriate for an existing .NET Framework exception, or the exception must be disambiguated from a similar exception. 예를 들어, throw 되는 경우는 ArgumentOutOfRangeException 대상 정수 계열 형식의 범위를 벗어났습니다 하는 문자열의 숫자 값을 구문 분석할 때 예외를 하지 하려는 호출자에 게 제공 안 함에서 생성 되는 오류에 대 한 동일한 예외를 사용 합니다 적절 한 제한 메서드를 호출할 때 값입니다.For example, if you throw an ArgumentOutOfRangeException exception when parsing the numeric representation of a string that is out of range of the target integral type, you would not want to use the same exception for an error that results from the caller not supplying the appropriate constrained values when calling the method.

Exception 클래스는.NET Framework의 모든 예외의 기본 클래스입니다.The Exception class is the base class of all exceptions in the .NET Framework. 여러 파생된 클래스 멤버의 상속 된 동작에 의존 합니다 Exception 클래스의 멤버를 재정의 하지 않습니다 Exception, 고유한 멤버를 정의할 것입니다.Many derived classes rely on the inherited behavior of the members of the Exception class; they do not override the members of Exception, nor do they define any unique members.

사용자 고유의 예외 클래스를 정의 합니다.To define your own exception class:

  1. 상속 되는 클래스를 정의 Exception합니다.Define a class that inherits from Exception. 필요한 경우 클래스는 예외에 대 한 추가 정보를 제공 하는 데 필요한 고유 멤버를 정의 합니다.If necessary, define any unique members needed by your class to provide additional information about the exception. 예를 들어를 ArgumentException 클래스에 포함 되어는 ParamName 인수에서 예외를 발생 시킨 매개 변수의 이름을 지정 하는 속성 및 RegexMatchTimeoutException 속성을 포함를 MatchTimeout 시간 제한 간격을 나타내는 속성입니다.For example, the ArgumentException class includes a ParamName property that specifies the name of the parameter whose argument caused the exception, and the RegexMatchTimeoutException property includes a MatchTimeout property that indicates the time-out interval.

  2. 필요한 경우 모든 상속 된 멤버 변경 하거나 수정 하려면 해당 기능을 재정의 합니다.If necessary, override any inherited members whose functionality you want to change or modify. 대부분의 기존 클래스의 파생 된 Exception 상속 된 멤버의 동작을 재정의 하지 않습니다.Note that most existing derived classes of Exception do not override the behavior of inherited members.

  3. 사용자 지정 예외 개체는 직렬화 할 수 있는지 여부를 결정 합니다.Determine whether your custom exception object is serializable. Serialization 예외에 대 한 정보를 저장할 수 있습니다 및 예외 정보를 원격 컨텍스트에서 서버 및 클라이언트 프록시를 공유할 수를 허용 합니다.Serialization enables you to save information about the exception and permits exception information to be shared by a server and a client proxy in a remoting context. 예외 개체를 직렬화 할 수 있도록 표시 하는 SerializableAttribute 특성입니다.To make the exception object serializable, mark it with the SerializableAttribute attribute.

  4. 예외 클래스의 생성자를 정의 합니다.Define the constructors of your exception class. 일반적으로 예외 클래스에 다음 생성자 중 하나 이상의:Typically, exception classes have one or more of the following constructors:

    • Exception()에 새 예외 개체의 속성을 초기화 하려면 기본값을 사용 하 합니다.Exception(), which uses default values to initialize the properties of a new exception object.

    • Exception(String)에 지정된 된 오류 메시지를 사용 하 여 새 예외 개체를 초기화 합니다.Exception(String), which initializes a new exception object with a specified error message.

    • Exception(String, Exception)에 지정 된 오류 메시지와 내부 예외를 사용 하 여 새 예외 개체를 초기화 합니다.Exception(String, Exception), which initializes a new exception object with a specified error message and inner exception.

    • Exception(SerializationInfo, StreamingContext)에를 protected serialize 된 데이터에서 새 예외 개체를 초기화 하는 생성자입니다.Exception(SerializationInfo, StreamingContext), which is a protected constructor that initializes a new exception object from serialized data. 예외 개체를 직렬화 할 수 있도록 선택한 경우이 생성자를 구현 해야 합니다.You should implement this constructor if you've chosen to make your exception object serializable.

다음 예제에서는 사용자 지정 예외 클래스의 사용을 보여 줍니다.The following example illustrates the use of a custom exception class. 정의 NotPrimeException 클라이언트 소수가 아닌는 시작 숫자를 지정 하 여 소수의 시퀀스를 검색 하려고 할 때 throw 되는 예외입니다.It defines a NotPrimeException exception that is thrown when a client tries to retrieve a sequence of prime numbers by specifying a starting number that is not prime. 새 속성을 정의 하는 예외 NonPrime는 소수 숫자가 아닌 예외를 발생 시킨 반환 합니다.The exception defines a new property, NonPrime, that returns the non-prime number that caused the exception. 매개 변수가 없는 생성자는 protected 생성자 및 사용 하는 생성자를 구현 하는 것 외에도 SerializationInfo 하 고 StreamingContext serialization에 대 한 매개 변수를 NotPrimeException 지원 하기 위해 세 가지 추가 생성자를 정의 하는 클래스를 NonPrime 속성.Besides implementing a protected parameterless constructor and a constructor with SerializationInfo and StreamingContext parameters for serialization, the NotPrimeException class defines three additional constructors to support the NonPrime property. 각 생성자의 여 소수 숫자가 아닌 값을 유지 하는 것 외에도 기본 클래스 생성자를 호출 합니다.Each constructor calls a base class constructor in addition to preserving the value of the non-prime number. 합니다 NotPrimeException 클래스도 표시 되는 SerializableAttribute 특성입니다.The NotPrimeException class is also marked with the SerializableAttribute attribute.

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; } }
}
Imports System.Runtime.Serialization

<Serializable()> _
Public Class NotPrimeException : Inherits Exception
   Private notAPrime As Integer

   Protected Sub New()
      MyBase.New()
   End Sub

   Public Sub New(value As Integer)
      MyBase.New(String.Format("{0} is not a prime number.", value))
      notAPrime = value
   End Sub

   Public Sub New(value As Integer, message As String)
      MyBase.New(message)
      notAPrime = value
   End Sub

   Public Sub New(value As Integer, message As String, innerException As Exception)
      MyBase.New(message, innerException)
      notAPrime = value
   End Sub

   Protected Sub New(info As SerializationInfo,
                     context As StreamingContext)
      MyBase.New(info, context)
   End Sub

   Public ReadOnly Property NonPrime As Integer
      Get
         Return notAPrime
      End Get
   End Property
End Class

PrimeNumberGenerator 다음 예와에서 같이 클래스 에라토스테네스의 체를 사용 하 여 해당 클래스 생성자 호출에서 클라이언트가 지정한 제한 2에서 소수 시퀀스를 계산 합니다.The PrimeNumberGenerator class shown in the following example uses the Sieve of Eratosthenes to calculate the sequence of prime numbers from 2 to a limit specified by the client in the call to its class constructor. 합니다 GetPrimesFrom 메서드 지정된 하한값 보다 크거나 같은 경우에 모든 소수를 반환 하지만 throw를 NotPrimeException 해당 하한값 소수 없는 경우.The GetPrimesFrom method returns all prime numbers that are greater than or equal to a specified lower limit, but throws a NotPrimeException if that lower limit is not a prime number.

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();
   }
}
Imports System.Collections.Generic

<Serializable()> Public Class PrimeNumberGenerator
   Private Const START As Integer = 2
   Private maxUpperBound As Integer = 10000000
   Private upperBound As Integer
   Private primeTable() As Boolean
   Private primes As New List(Of Integer)

   Public Sub New(upperBound As Integer)
      If upperBound > maxUpperBound Then
         Dim message As String = String.Format(
             "{0} exceeds the maximum upper bound of {1}.",
             upperBound, maxUpperBound)
         Throw New ArgumentOutOfRangeException(message)
      End If
      Me.upperBound = upperBound
      ' Create array and mark 0, 1 as not prime (True).
      ReDim primeTable(upperBound)
      primeTable(0) = True
      primeTable(1) = True

      ' Use Sieve of Eratosthenes to determine prime numbers.
      For ctr As Integer = START To CInt(Math.Ceiling(Math.Sqrt(upperBound)))
         If primeTable(ctr) Then Continue For

         For multiplier As Integer = ctr To CInt(upperBound \ ctr)
            If ctr * multiplier <= upperBound Then primeTable(ctr * multiplier) = True
         Next
      Next
      ' Populate array with prime number information.
      Dim index As Integer = START
      Do While index <> -1
         index = Array.FindIndex(primeTable, index, Function(flag)
                                                       Return Not flag
                                                    End Function)
         If index >= 1 Then
            primes.Add(index)
            index += 1
         End If
      Loop
   End Sub

   Public Function GetAllPrimes() As Integer()
      Return primes.ToArray()
   End Function

   Public Function GetPrimesFrom(prime As Integer) As Integer()
      Dim start As Integer = primes.FindIndex(Function(value)
                                                 Return value = prime
                                              End Function)
      If start < 0 Then
         Throw New NotPrimeException(prime, String.Format("{0} is not a prime number.", prime))
      Else
         Return primes.FindAll(Function(value)
                                  Return value >= prime
                               End Function).ToArray()
      End If
   End Function
End Class

두 번 호출 하는 다음 예제는 GetPrimesFrom 메서드 사용 하 여 소수가 아닌 숫자를 응용 프로그램 도메인 경계를 교차 하는 중입니다.The following example makes two calls to the GetPrimesFrom method with non-prime numbers, one of which crosses application domain boundaries. 두 경우에는 예외가 throw 되 고 클라이언트 코드에서 성공적으로 처리 합니다.In both cases, the exception is thrown and successfully handled in client code.

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("--------");
      }
   }
}
Imports System.Reflection

Module Example
   Sub Main()
      Dim limit As Integer = 10000000
      Dim primes As New PrimeNumberGenerator(limit)
      Dim start As Integer = 1000001
      Try
         Dim values() As Integer = primes.GetPrimesFrom(start)
         Console.WriteLine("There are {0} prime numbers from {1} to {2}",
                           start, limit)
      Catch e As NotPrimeException
         Console.WriteLine("{0} is not prime", e.NonPrime)
         Console.WriteLine(e)
         Console.WriteLine("--------")
      End Try

      Dim domain As AppDomain = AppDomain.CreateDomain("Domain2")
      Dim gen As PrimeNumberGenerator = domain.CreateInstanceAndUnwrap(
                                        GetType(Example).Assembly.FullName,
                                        "PrimeNumberGenerator", True,
                                        BindingFlags.Default, Nothing,
                                        {1000000}, Nothing, Nothing)
      Try
         start = 100
         Console.WriteLine(gen.GetPrimesFrom(start))
      Catch e As NotPrimeException
         Console.WriteLine("{0} is not prime", e.NonPrime)
         Console.WriteLine(e)
         Console.WriteLine("--------")
      End Try
   End Sub
End Module
' The example displays the following output:
'      1000001 is not prime
'      NotPrimeException: 1000001 is not a prime number.
'         at PrimeNumberGenerator.GetPrimesFrom(Int32 prime)
'         at Example.Main()
'      --------
'      100 is not prime
'      NotPrimeException: 100 is not a prime number.
'         at PrimeNumberGenerator.GetPrimesFrom(Int32 prime)
'         at Example.Main()
'      --------

Windows 런타임 및 .NET Framework 4.5.1.NET Framework 4.5.1Windows Runtime and .NET Framework 4.5.1.NET Framework 4.5.1

Windows 8.x 스토어 앱용 .NET.NET for Windows 8.x Store apps 에 대 한 Windows 8Windows 8,.NET Framework 이외의 스택 프레임을 통해 예외가 전파 될 때 몇 가지 예외 정보에는 일반적으로 손실 됩니다.In Windows 8.x 스토어 앱용 .NET.NET for Windows 8.x Store apps for Windows 8Windows 8, some exception information is typically lost when an exception is propagated through non-.NET Framework stack frames. 로 시작 합니다 .NET Framework 4.5.1.NET Framework 4.5.1Windows 8.1Windows 8.1, 공용 언어 런타임에서 계속 원래 사용 Exception 해당 예외는.NET Framework 이외의 스택 프레임에서 수정 된 경우가 아니면 throw 된 개체를 합니다.Starting with the .NET Framework 4.5.1.NET Framework 4.5.1 and Windows 8.1Windows 8.1, the common language runtime continues to use the original Exception object that was thrown unless that exception was modified in a non-.NET Framework stack frame.

생성자

Exception()

Exception 클래스의 새 인스턴스를 초기화합니다. Initializes a new instance of the Exception class.

Exception(SerializationInfo, StreamingContext)

serialize된 데이터를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다. Initializes a new instance of the Exception class with serialized data.

Exception(String)

지정된 오류 메시지를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다. Initializes a new instance of the Exception class with a specified error message.

Exception(String, Exception)

지정된 오류 메시지와 해당 예외의 원인인 내부 예외에 대한 참조를 사용하여 Exception 클래스의 새 인스턴스를 초기화합니다. Initializes a new instance of the Exception class with a specified error message and a reference to the inner exception that is the cause of this exception.

속성

Data

예외에 대한 사용자 정의 추가 정보를 제공하는 키/값 쌍의 컬렉션을 가져옵니다. Gets a collection of key/value pairs that provide additional user-defined information about the exception.

HelpLink

이 예외와 연결된 도움말 파일에 대한 링크를 가져오거나 설정합니다. Gets or sets a link to the help file associated with this exception.

HResult

특정 예외에 할당된 코드화된 숫자 값인 HRESULT를 가져오거나 설정합니다. Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

InnerException

현재 예외를 발생시킨 Exception 인스턴스를 가져옵니다. Gets the Exception instance that caused the current exception.

Message

현재 예외를 설명하는 메시지를 가져옵니다. Gets a message that describes the current exception.

Source

오류를 발생시키는 응용 프로그램 또는 개체의 이름을 가져오거나 설정합니다. Gets or sets the name of the application or the object that causes the error.

StackTrace

호출 스택의 직접 실행 프레임 문자열 표현을 가져옵니다. Gets a string representation of the immediate frames on the call stack.

TargetSite

현재 예외를 throw하는 메서드를 가져옵니다. Gets the method that throws the current exception.

메서드

Equals(Object)

지정한 개체와 현재 개체가 같은지 여부를 확인합니다. Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException()

파생 클래스에서 재정의된 경우 하나 이상의 후속 예외의 근본 원인이 되는 Exception을 반환합니다. When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

GetHashCode()

기본 해시 함수로 작동합니다. Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext)

파생 클래스에서 재정의된 경우 예외에 관한 정보를 SerializationInfo에 설정합니다. When overridden in a derived class, sets the SerializationInfo with information about the exception.

GetType()

현재 인스턴스의 런타임 형식을 가져옵니다. Gets the runtime type of the current instance.

MemberwiseClone()

현재 Object의 단순 복사본을 만듭니다. Creates a shallow copy of the current Object.

(Inherited from Object)
ToString()

현재 예외에 대한 문자열 표현을 만들고 반환합니다. Creates and returns a string representation of the current exception.

이벤트

SerializeObjectState

예외에 대한 serialize된 데이터를 포함하는 예외 상태 개체를 만들기 위해 예외를 serialize할 때 발생합니다. Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

적용 대상

추가 정보