C#異常処理と心得


C sharpの異常はシステムレベルとアプリケーションレベルのエラー状態を処理するために使用され、構造化され、統一されたタイプの安全な処理メカニズムである.c#の異常メカニズムはc++の異常処理メカニズムによく似ていますが、いくつかの重要な違いがあります.
1,C#では,すべての異常はSystemから行う必要がある.Exceptionから派生したクラスタイプのインスタンスを表します.C++では、任意のタイプの任意の値を使用して例外を表すことができます.
2,C#においてfinallyブロックを用いて,通常の実行と異常の両方で実行される終了コードを記述する.C++では,コードを繰り返さずにこのようなコードを記述することは困難である.
3,C#では,オーバーフロー,ゼロ除算,nullなどのシステムレベルの異常に対応して,それに一致する異常クラスが定義され,アプリケーションレベルのエラー状態と同等の地位にある.
1.1異常の原因
2つの異なる方法で異常を引き起こすことができる.
・throw文(セクション8.9.5)は、直ちに無条件に異常を引き起こすために使用される.制御はthrowの後に続く文には到達しません.
・C#文と式の実行中に例外が発生し、一部の操作が正常に完了しない場合、例外が発生します.例えば、整数除算演算(7.8.2節)では、分母がゼロの場合、Systemが発生する.DivideByZeroException.この方法で発生する可能性のある様々な例外のリストについては、セクション16.4を参照してください.
1.2 System.Exceptionクラス
System.Exceptionクラスはすべての例外のベースタイプです.このクラスには、例外共有のいくつかの注意すべき属性があります.
・Messageはstringタイプの読み取り専用属性であり、異常の原因についての説明(手動で読みやすい)を含む.
・InnerExceptionは、Exceptionタイプの読み取り専用属性です.値がnullでない場合、現在の例外が発生した例外を参照します.すなわち、現在の例外がそのInnerExceptionを処理するcatchブロックで発生したことを示します.そうでない場合、nullの値は、別の例外によって引き起こされたものではないことを示します.このようにリンクされた例外オブジェクトの数は任意であってもよい.
これらの属性の値はSystemを呼び出すことができる.Exceptionのインスタンス構築関数の場合に指定します.
1.3異常の処理方式
異常が発生すると、異常を処理できる最近のcatch句が検索されます(異常の実行時タイプに基づいて決定されます).まず、現在のメソッドを検索して、文法に含まれるtry文を検索し、そのtry文に関連する各catch句を順番に考察します.上記の操作に失敗した場合、現在のメソッドが呼び出されたメソッドでは、現在のメソッド呼び出しコードの位置を構文に含むtry文を検索します.この検索は、現在の例外を処理できるcatch句が見つかるまで続行されます(この句は、現在例外を開始しているランタイムタイプと同じクラスまたはランタイムタイプが属するクラスのベースクラスに属する例外クラスを指定します).例外クラスを指定していないcatch句は、例外を処理できます.
一致するcatch句が見つかった場合、システムはそのcatch句の最初の文に制御を移行します.catch文の実行が開始される前に、システムは、異常をキャプチャしたtry文にネストされたすべてのtry文に対応するすべてのfinally文を最初に順番に実行します.
一致するcatch句が見つからない場合は、次の2つのケースが発生します.
・一致するcatch句の探索が静的コンストラクタ(セクション10.12)または静的フィールドの初期値設定項目に到達と、その静的コンストラクタが呼び出されるコードの位置でSystemが開始する.TypeInitializationException.システムTypeInitializationExceptionの内部異常には、最初に発生した異常が含まれます.
・一致するcatch句の検索が、現在のスレッドを最初に起動したコードに到達すると、そのスレッドの実行は終了する.このような終了がどのような影響を及ぼすかは、実装によって定義されるべきである.
特に,構造関数の実行中に発生する異常に注目すべきである.構造関数の実行中に例外が発生し、その例外が取得されなかった場合、構造関数の実行は終了し、そのベースクラスの構造関数(ある場合)が呼び出されます.objectタイプの場合などのベースクラスがない場合、またはベースクラス構造関数がない場合、この例外は無視されます.
1.1共通異常クラス以下の異常は、いくつかのC#操作によって発生します.
System.ArrayTypeMismatchException

配列を格納すると、格納された要素の実際のタイプが配列の実際のタイプと互換性がないため、格納に失敗すると、この例外が発生します.
System.DivideByZeroException

ゼロで整数値を除去しようとすると開始します.
System.IndexOutOfRangeException

ゼロ未満または配列の限界を超えたインデックス配列を使用しようとすると開始します.
System.InvalidCastException

この例外は、ベースタイプまたはインタフェースから派生タイプへの明示的な変換が実行中に失敗した場合に発生します.
System.NullReferenceException

リファレンスオブジェクトを使用する必要がある場合、nullリファレンスを使用すると、この例外が発生します.
System.OutOfMemoryException

メモリの割り当て(new経由)の試行に失敗した場合に発生します.
System.OverflowException

checkedコンテキストの算術演算がオーバーフローしたときに開始します.
System.StackOverflowException

この例外は、保留中のメソッド呼び出しが保存されすぎて実行スタックが消費されると発生します.これは通常,非常に深いまたは無限の再帰の存在を示す.
System.TypeInitializationException

静的構造関数が異常を起こし、catch句をキャプチャできない場合に開始します.
okay上記の内容はc#言語規範の中で異常処理に対する総括で、以下は私たちのこれらの初心者がよく現れる問題を総括して、達人たちに補充して、ありがとうございます!一、using命令またはプログラムセット参照が欠けていますか?これは私が最近の探求の中でよく出会う問題で、すでに引用を追加しましたが、いつもヒントを与えて、とても苦しめて、私は2つの比較的に普通の処理をまとめました:1、修正:クラスファイル--属性--生成操作--「内容」を「コンパイル」に変えて、それから再生成して、問題は解決します.2、もう一つのケース:プロジェクトには複数のクラスライブラリが存在し、プロジェクトを生成する際にプロンプトがタイプまたはネーミングスペース名「XXXX」を見つけられなかった(using命令またはプログラムセット参照が欠けているかどうか?)を選択すると、対応するクラスライブラリの「参照」フォルダが見つかり、その中に対応するdllファイルが追加され、個別にこのようなライブラリが生成されます.また、プロンプトが表示される場合は、「参照」に他のクラスライブラリを参照して生成されたdllファイルがあるかどうかを確認する必要があります.存在する場合は、そのdllファイルを生成したクラスライブラリが正常に生成されることを確認してから、プロジェクト全体が最終的に生成されます.二、try、catch、finally私はこのように理解して、先にtryの中の文を実行して、もしtryの中の文が間違いを投げ出したら、catchに捕獲されるので、tryの中の文の実行を中断してcatchの中の文を実行して、tryの中の文がすべて実行しても間違いを投げ出していないならば、catchの中の文は実行する機会がありません.最後にtryが順調に実行されても、tryがエラーを投げ出してcatch文にキャプチャされ、catchを実行した文はfinallyの中の文を実行します.でもなんか欠点があるな~
ここではmsdn上の最適な異常処理方法を示し,役に立つことを望んでいる.
http://msdn.microsoft.com/zh-cn/library/seyhszts.aspx