Exception Exception Exception Exception Class

定義

アプリケーションの実行中に発生したエラーを表します。Represents errors that occur during application execution.

public ref class Exception : System::Runtime::InteropServices::_Exception, System::Runtime::Serialization::ISerializable
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.AutoDual)]
[System.Serializable]
public class Exception : System.Runtime.InteropServices._Exception, System.Runtime.Serialization.ISerializable
type Exception = class
    interface ISerializable
    interface _Exception
Public Class Exception
Implements _Exception, ISerializable
継承
ExceptionExceptionExceptionException
派生
属性
実装

次の例は、 catchエラーを処理ArithmeticExceptionするために定義されているブロックを示しています。The following example demonstrates a catch block that is defined to handle ArithmeticException errors. このcatchブロックは、 DivideByZeroExceptionからcatch DivideByZeroException DivideByZeroException 派生しArithmeticException 、エラーのために明示的に定義されたブロックがないため、エラーもキャッチします。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: {e}");
      }
      catch (Exception e) 
      {
         Console.WriteLine($"Generic Exception Handler: {e}");
      }
   }	
}
/*
This code example produces the following results:

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

*/
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. エラーが発生した場合、システムまたは現在実行中のアプリケーションは、エラーに関する情報を含む例外をスローすることによって、エラーを報告します。When an error occurs, either the system or the currently executing application reports it by throwing an exception that contains information about the error. 例外がスローされた後は、アプリケーションまたは既定の例外ハンドラーによって処理されます。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 クラスのプロパティ Exception class properties
パフォーマンスに関する考慮事項 Performance considerations
例外を再スローする 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例外は、がobj nullである場合に、 Object.Equalsオーバーライドを呼び出してから再コンパイルする前に、明示的に null をテストするようにソースコードを変更することによって、結果を取り除くことができます。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.ParseExactしたかどうかを示す値を返します。メソッド。日付文字列を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メソッドを呼び出すことによってファイルを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. たとえば、共通言語ランタイムが追加の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. 1つまたは複数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. 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. Catch catchブロックの型フィルターでまたTはから派生した型が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. を処理System.Exceptionする catch ブロックが最後に指定されています。A catch block that handles System.Exception is specified last.

try try catch catch現在のブロックに関連付けられているブロックで例外が処理されず、現在のブロックが現在の呼び出しの他のブロック内で入れ子になっている場合は、次のブロックに関連付けられtryているブロック。囲む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. このテキストメッセージは、exception オブジェクト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.

  • 例外がスローされたときの呼び出し履歴の状態。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 クラスのプロパティException class properties

クラスExceptionには、コードの場所、型、ヘルプファイル、および例外の理由Message Source( StackTrace InnerException HelpLink HResult、、、、、、) を識別するのに役立つ多数のプロパティが含まれています。、、 Dataおよび。 TargetSiteThe 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.

2つ以上の例外の間に因果関係が存在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

例外をスローまたは処理すると、大量のシステムリソースと実行時間が消費されます。Throwing or handling an exception consumes a significant amount of system resources and execution time. 例外をスローするのは、予測可能なイベントやフロー制御を処理するのではなく、本当に特別な条件を処理する場合のみです。Throw exceptions only to handle truly extraordinary conditions, not to handle predictable events or flow control. たとえば、クラスライブラリを開発している場合など、メソッドの引数が無効である場合は例外をスローすることが妥当です。有効なパラメーターを使用してメソッドを呼び出すことが想定されているためです。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. 逆に、ユーザーの入力が無効な場合は、ユーザーが無効なデータを頻繁に入力することが予想されるため、例外をスローしません。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.

また、リターンコードが十分である場合は、例外をスローしないでください。リターンコードを例外に変換しないでください。また、例外を定期的にキャッチせず、無視して処理を続行することもありません。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.

例外の再スローRe-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. 例外ハンドラーは例外をログに記録し、例外を再スローすることができます。The exception handler can log the exception and then re-throw the exception.

例外を再スローするには、のC# throwステートメントと、式を含まない Visual Basic のthrowステートメントを使用することをお勧めします。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)に、の1つ以上の呼び出しをラップします。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元は2回を呼び出します。A caller then calls FindOccurrences twice. の2回目のFindOccurrences呼び出しでは、呼び出しnull元はを検索文字列としてString.IndexOf(String, Int32)渡します。この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()  

もう少し厄介な方法は、新しい例外をスローし、元の例外の呼び出し履歴情報を内部例外で保持することです。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

例外をスローする必要がある場合は、カスタム例外を実装するのではなく、.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. 次の2つの条件下では、標準の例外の種類を使用する必要があります。You should use a standard exception type under these two conditions:

  • 使用エラー (つまり、メソッドを呼び出している開発者によって作成されたプログラムロジックのエラー) によって発生した例外をスローしています。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). 通常は、 ArgumentException、、 InvalidOperationExceptionArgumentNullException 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. できるだけ多くの派生された例外をスローする必要があります。You should throw the most derived exception possible. たとえば、メソッドで、引数が列挙型の有効なメンバーである必要がある場合は、では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.

次の表に、一般的な例外の種類と、それらをスローする条件を示します。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 無効な Uniform Resource Identifier (URI) が使用されています。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. たとえば、ターゲットの整数型の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 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. Exception クラスのコンストラクターを定義します。Define the constructors of your exception class. 通常、例外クラスには、次のコンストラクターが1つ以上含まれています。Typically, exception classes have one or more of the following constructors:

    • Exception()。既定値を使用して、新しい 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シリアル化されたデータから新しい例外オブジェクトを初期化するコンストラクターです。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クライアントが素数ではない開始番号を指定して素数のシーケンスを取得しようとしたときにスローされる例外を定義します。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. 保護されたパラメーターなしのコンストラクターと、 SerializationInfoシリアルStreamingContext化のパラメーターとパラメーター NotPrimeExceptionを持つコンストラクターを実装するだけでNonPrimeなく、クラスは、プロパティをサポートするために3つの追加のコンストラクターを定義します。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. クラスは、 SerializableAttribute属性でもマークされます。 NotPrimeExceptionThe 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

次の例に示すクラスでは、ありのエラトステネスを使用して、2からの素数のシーケンスを、クラスコンストラクターの呼び出しでクライアントによって指定された制限に計算します。PrimeNumberGeneratorThe 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は、指定された下限を超えるすべての素数を返しますが、下限の値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

次の例では、2つGetPrimesFromのメソッドを呼び出します。素数以外の数値が含まれています。その1つは、アプリケーションドメインの境界を越えています。The following example makes two calls to the GetPrimesFrom method with non-prime numbers, one of which crosses application domain boundaries. どちらの場合も、例外がスローされ、クライアントコードで正常に処理されます。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 appsWindows 8Windows 8では、例外が non-.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. と以降では、non-.NET Framework スタックフレームで例外が変更さExceptionれていない限り、共通言語ランタイムは、スローされた元のオブジェクトを引き続き使用します。 Windows 8.1Windows 8.1 .NET Framework 4.5.1.NET Framework 4.5.1Starting 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() Exception() Exception()

Exception クラスの新しいインスタンスを初期化します。Initializes a new instance of the Exception class.

Exception(SerializationInfo, StreamingContext) Exception(SerializationInfo, StreamingContext) Exception(SerializationInfo, StreamingContext) Exception(SerializationInfo, StreamingContext)

シリアル化したデータを使用して、Exception クラスの新しいインスタンスを初期化します。Initializes a new instance of the Exception class with serialized data.

Exception(String) Exception(String) Exception(String) Exception(String)

指定したエラー メッセージを使用して、Exception クラスの新しいインスタンスを初期化します。Initializes a new instance of the Exception class with a specified error message.

Exception(String, Exception) Exception(String, Exception) Exception(String, Exception) 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 Data Data Data

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。Gets a collection of key/value pairs that provide additional user-defined information about the exception.

HelpLink HelpLink HelpLink HelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。Gets or sets a link to the help file associated with this exception.

HResult HResult HResult HResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

InnerException InnerException InnerException InnerException

現在の例外の原因となる Exception インスタンスを取得します。Gets the Exception instance that caused the current exception.

Message Message Message Message

現在の例外を説明するメッセージを取得します。Gets a message that describes the current exception.

Source Source Source Source

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。Gets or sets the name of the application or the object that causes the error.

StackTrace StackTrace StackTrace StackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。Gets a string representation of the immediate frames on the call stack.

TargetSite TargetSite TargetSite TargetSite

現在の例外がスローされたメソッドを取得します。Gets the method that throws the current exception.

メソッド

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException() GetBaseException() GetBaseException() GetBaseException()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。When overridden in a derived class, sets the SerializationInfo with information about the exception.

GetType() GetType() GetType() GetType()

現在のインスタンスのランタイム型を取得します。Gets the runtime type of the current instance.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

現在の例外の文字列形式を作成して返します。Creates and returns a string representation of the current exception.

イベント

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

適用対象

こちらもご覧ください