例外Exceptions

C# での例外システム レベルとアプリケーション レベルの両方を処理する構造化、統一された、およびタイプ セーフな方法を使用するエラー条件。Exceptions in C# provide a structured, uniform, and type-safe way of handling both system level and application level error conditions. C# の例外処理機構は、いくつかの重要な相違点、C に非常に似ています。The exception mechanism in C# is quite similar to that of C++, with a few important differences:

  • C# の場合は、すべての例外をから派生したクラス型のインスタンスで表す必要があるSystem.Exceptionします。In C#, all exceptions must be represented by an instance of a class type derived from System.Exception. C++ では、例外を表す任意の型の任意の値を使用できます。In C++, any value of any type can be used to represent an exception.
  • C# の finally ブロック (try ステートメント) 通常の実行と例外条件の両方で実行される終了コードを記述するために使用できます。In C#, a finally block (The try statement) can be used to write termination code that executes in both normal execution and exceptional conditions. このようなコードは C++ で記述するコードを複製しなくても困難です。Such code is difficult to write in C++ without duplicating code.
  • C# の場合は、オーバーフロー、0 による除算、および null の逆参照などのシステム レベルの例外は、適切に定義の例外クラスとアプリケーション レベルのエラー状態と同等にします。In C#, system-level exceptions such as overflow, divide-by-zero, and null dereferences have well defined exception classes and are on a par with application-level error conditions.

例外の原因Causes of exceptions

2 つの方法では、例外をスローできます。Exception can be thrown in two different ways.

  • Athrowステートメント (throw ステートメント) すぐに、無条件で例外をスローします。A throw statement (The throw statement) throws an exception immediately and unconditionally. 制御がすぐに次のステートメントに到達しません、throwします。Control never reaches the statement immediately following the throw.
  • C# のステートメントと式の処理中に発生する特定の例外的な条件では、特定の状況で例外が発生、操作を正常に終了できない場合。Certain exceptional conditions that arise during the processing of C# statements and expression cause an exception in certain circumstances when the operation cannot be completed normally. たとえば、整数除算演算を (除算演算子) がスローされます、System.DivideByZeroException分母が 0 の場合。For example, an integer division operation (Division operator) throws a System.DivideByZeroException if the denominator is zero. 参照してください共通例外クラスこの方法で発生するさまざまな例外の一覧についてはします。See Common Exception Classes for a list of the various exceptions that can occur in this way.

System.Exception クラスThe System.Exception class

System.Exceptionクラスは、すべての例外の基本型。The System.Exception class is the base type of all exceptions. このクラスでは、すべての例外を共有するいくつかの注目すべきプロパティがあります。This class has a few notable properties that all exceptions share:

  • Message 型の読み取り専用プロパティは、string例外の原因の人間が判読できる説明を格納しています。Message is a read-only property of type string that contains a human-readable description of the reason for the exception.
  • InnerException 型の読み取り専用プロパティは、Exceptionします。InnerException is a read-only property of type Exception. 現在の例外の原因となった例外をその値が null 以外の場合は、参照: catch ブロックで現在の例外が発生したは、処理、InnerExceptionします。If its value is non-null, it refers to the exception that caused the current exception—that is, the current exception was raised in a catch block handling the InnerException. それ以外の場合、その値が null の場合、この例外が別の例外によって原因がないことを示します。Otherwise, its value is null, indicating that this exception was not caused by another exception. この方法で連結例外オブジェクトの数は任意にできます。The number of exception objects chained together in this manner can be arbitrary.

これらのプロパティの値は、インスタンス コンス トラクターの呼び出しで指定できますSystem.Exceptionします。The value of these properties can be specified in calls to the instance constructor for System.Exception.

例外の処理方法How exceptions are handled

例外の処理によって、tryステートメント (try ステートメント)。Exceptions are handled by a try statement (The try statement).

例外が発生したときに、システム検索、最も近いcatch句を例外の実行時の型によって決定される例外を処理することができます。When an exception occurs, the system searches for the nearest catch clause that can handle the exception, as determined by the run-time type of the exception. 字句外側の現在のメソッドを検索する最初に、tryステートメント、および try ステートメントの関連付けられている catch 句は、順番と見なされます。First, the current method is searched for a lexically enclosing try statement, and the associated catch clauses of the try statement are considered in order. 現在のメソッドを呼び出したメソッドが構文的囲む検索失敗した場合、tryステートメントを囲むの現在のメソッドの呼び出しをポイントします。If that fails, the method that called the current method is searched for a lexically enclosing try statement that encloses the point of the call to the current method. この検索はまで継続されます、catchによっては、同じクラスまたは基本クラス、スローされる例外の実行時の型の例外クラスの名前を付け、現在の例外を処理できる句が見つかった。This search continues until a catch clause is found that can handle the current exception, by naming an exception class that is of the same class, or a base class, of the run-time type of the exception being thrown. Acatchを例外クラスを指定しない句は、すべての例外を処理できます。A catch clause that doesn't name an exception class can handle any exception.

一致する catch 句が見つかったら、catch 句の最初のステートメントに制御を転送する、システムを準備します。Once a matching catch clause is found, the system prepares to transfer control to the first statement of the catch clause. Catch 句の実行が開始する前に、システム最初に実行される、順番にいずれかのfinallytry ステートメントの詳細に関連付けられていた句はするよりも、例外をキャッチした入れ子になった。Before execution of the catch clause begins, the system first executes, in order, any finally clauses that were associated with try statements more nested that than the one that caught the exception.

一致する catch 句が見つからない場合は、次の 2 つのいずれかに発生します。If no matching catch clause is found, one of two things occurs:

  • 一致する catch 句の検索には、静的コンス トラクターに達すると (静的コンス トラクター) または静的フィールド初期化子、System.TypeInitializationExceptionが静的コンス トラクターの呼び出しをトリガーした時点でスローされます。If the search for a matching catch clause reaches a static constructor (Static constructors) or static field initializer, then a System.TypeInitializationException is thrown at the point that triggered the invocation of the static constructor. 内部例外、System.TypeInitializationException最初にスローされた例外が含まれています。The inner exception of the System.TypeInitializationException contains the exception that was originally thrown.
  • 一致する catch 句の検索では、最初のスレッドを開始するコードに達すると、スレッドの実行が終了します。If the search for matching catch clauses reaches the code that initially started the thread, then execution of the thread is terminated. このような終了の影響は、実装定義です。The impact of such termination is implementation-defined.

デストラクターの実行中に発生する例外は、特に注意する必要があります。Exceptions that occur during destructor execution are worth special mention. デストラクターの実行中に例外が発生して、その例外はキャッチされず場合、は、そのデストラクターの実行を終了し、(ある場合) は、基底クラスのデストラクターが呼び出されます。If an exception occurs during destructor execution, and that exception is not caught, then the execution of that destructor is terminated and the destructor of the base class (if any) is called. 基底クラスが存在しない場合 (の場合と同様、object型) または基底クラスのデストラクターがないかどうかは、例外は破棄されます。If there is no base class (as in the case of the object type) or if there is no base class destructor, then the exception is discarded.

一般的な例外クラスCommon Exception Classes

特定の c# 操作によっては、次の例外がスローされます。The following exceptions are thrown by certain C# operations.

System.ArithmeticException 算術演算中に発生する例外 (System.DivideByZeroExceptionSystem.OverflowException など) の基底クラスです。A base class for exceptions that occur during arithmetic operations, such as System.DivideByZeroException and System.OverflowException.
System.ArrayTypeMismatchException 格納される要素の実際の型は、配列の実際の型と互換性がないために、配列への格納が失敗したときにスローされます。Thrown when a store into an array fails because the actual type of the stored element is incompatible with the actual type of the array.
System.DivideByZeroException 整数値を 0 で除算しようとすると、発生したときにスローされます。Thrown when an attempt to divide an integral value by zero occurs.
System.IndexOutOfRangeException 0 未満か、配列の境界の外側であるインデックスを使用して、配列のインデックスを作成するとスローされます。Thrown when an attempt to index an array via an index that is less than zero or outside the bounds of the array.
System.InvalidCastException 実行時に基本型またはインターフェイスから派生型への明示的な変換が失敗したときにスローされます。Thrown when an explicit conversion from a base type or interface to a derived type fails at run time.
System.NullReferenceException 場合にスローされる、null参照が参照先オブジェクトを必要とする方法で使用されています。Thrown when a null reference is used in a way that causes the referenced object to be required.
System.OutOfMemoryException メモリを割り当てようとした場合にスローされます (を使用してnew) が失敗します。Thrown when an attempt to allocate memory (via new) fails.
System.OverflowException checked コンテキストで算術演算がオーバーフローしたときにスローされます。Thrown when an arithmetic operation in a checked context overflows.
System.StackOverflowException 保留中のメソッドの呼び出しが多すぎる; することで実行スタックが空になった場合にスローされます。非常に深いか、無限再帰の通常気付く。Thrown when the execution stack is exhausted by having too many pending method calls; typically indicative of very deep or unbounded recursion.
System.TypeInitializationException 静的コンス トラクターが存在し、例外をスローする場合にスローcatchキャッチする句が存在します。Thrown when a static constructor throws an exception, and no catch clauses exists to catch it.