System.Exceptionクラス
C#で定義されている例外クラスは多数あり、C#のすべての例外クラスはSystem.Exception
サブクラスです。それは2つのサブカテゴリを導き出します:SystemException
とApplicationException
。前者はシステムによって定義されたさまざまな例外であり、後者はアプリケーションで使用するために提供されています。
Exception
一般的に使用される2つの構築方法があります。
public Exception();
public Exception(string s);
2番目の構築方法は、文字列パラメーターによって渡された情報を受け入れることができます。これは通常、例外に対応するエラーの説明です。Exception
クラスには、Message
属性とStackTrace
属性という2つの重要な属性があります。
メッセージプロパティ:エラーを説明する読み取り可能なテキスト。例外オブジェクトを作成するプロセスでは、特定の例外の詳細情報を説明するテキスト文字列をコンストラクターに渡すことができます。
StackTraceプロパティ例外が発生したときの呼び出しスタックの状態。エラーが発生したスタックトレース、呼び出されたすべてのメソッド、およびソースファイル内のこれらの呼び出しの行番号を含みます。
システム定義の例外
次の表:
例外をキャッチして処理する
C#の例外処理メカニズムは、次の手順に要約できます。
- ①C#プログラムの実行中に例外が発生した場合、例外オブジェクトが自動的に生成され、例外オブジェクトがC#ランタイムシステムに送信されます。このプロセスは、例外のスローと呼ばれます。例外をスローすることは、プログラムによって
throw
ステートメントを使用するように強制されることもあります。 - ②C#ランタイムシステムは、例外オブジェクトを受信すると、例外を処理できるコードを探し、現在の例外オブジェクトを処理のために渡します。このプロセスは、例外のキャッチと呼ばれます。
- ③C#ランタイムシステムが例外をキャッチする方法を見つけられない場合、ランタイムシステムは終了し、対応するC#プログラムも終了します。
1.例外をスローします
C#プログラムが実行時に識別可能なエラーを引き起こす場合、エラーに対応する例外クラスのオブジェクトが生成されます。このプロセスは例外スローと呼ばれます。
(1)
システムによって自動的にスローされる例外すべてのシステム定義の動作例外は、システムによって自動的にスローされる可能性があります。
(2)ステートメントによってスローさ
れる例外ユーザー定義の例外は、システムによって自動的にスローされることはありません。代わりに、throw
ステートメントを使用して、このタイプの例外に対応するエラーの種類を定義する必要があり、新しいタイプの例外がスローされます。オブジェクト。形式は次のとおりです。
throw 异常对象;
2.例外キャッチをキャッチします
例外がスローされると、スローされた例外オブジェクトを受け取るための特別なステートメントが必要になります。このプロセスは、例外のキャッチと呼ばれます。異常なオブジェクトがキャッチまたは受信されると、ユーザープログラムはフローにジャンプし、システムは現在のフローを終了して特別な例外処理ブロックにジャンプするか、現在のプログラムからジャンプして終了します。
C#プログラムcatch
でステートメントを使用します。形式は次のとおりです。
try {
语句组
} catch(异常类名 异常形式参数名) {
异常处理语句
} catch(异常类名 异常形式参数名) {
异常处理语句
} finally {
异常处理语句
}
少なくとも1つのcatch
ステートメントがありfinally
ます。
Finalステートメント:この finally
ステートメントは、例外処理のための統一された出口を提供します。finallyブロックのステートメントは、try
コードブロックとブロックcatch
で異常イベントが発生したかどうかに関係なく、またステートメント(つまり、使用return
またはthrow
スロー)に関係なく実行されます。例外)。
ユーザー定義の例外クラス
ユーザー定義の例外を作成するときは、通常、次のタスクを完了する必要があります。
- ①新しい例外クラスを宣言し、それを
ApplicationException
親クラスまたはその他の既存のシステム例外クラスまたはユーザー例外クラスにします。 - ②新しい異常クラスの属性とメソッドを定義するか、親クラスの属性とメソッドをオーバーロードして、これらの属性とメソッドがクラスに対応するエラー情報を反映できるようにします。
例えば:
public class MyAppException : ApplicationException
{
public MyAppException(string message) : base(message) {
}
}
例外と異常なリンクを再スローします
システムでは、例外をキャプチャして処理できます。場合によっては、例外を処理するだけでなく、呼び出し元に例外を渡して、呼び出し元も例外を感じられるようにする必要があります。現時点では、catchステートメントブロックまたはfinallyステートメントブロックで次の3つの方法をとることができます。
- ①式のない
throw
ステートメントを使用して、現在キャッチされている例外を再度スローします。形式は次のとおりです。
throw;
- ②例外を再生成して、次のようにスローします。
throw new Exception("some message");
- ③次のような現在の例外情報を含む新しい例外を再生成してスローします。
throw new Exception("some message", e);
その中でも、最後の方法は、現在の異常な情報を保持し、より意味のある情報を呼び出し元に返すため、より優れています。このアプローチは「異常なリンク」と呼ばれます。関連する例外がすべてこのように採用されると、上位層の呼び出し元は、関連する例外情報を徐々に深く見つけることができます。
このように、Exception
クラスMessage
、StackTrace
属性、ToString()
メソッドに加えて、属性も一般的に使用されInnerException
ます。
InnerException
この例外の「内部例外」を含む読み取り専用属性です。そうでない場合はnull
、現在の例外が別の例外へのリンクとしてスローされたことを示します。属性
をInnerException
指定するには、次の構築方法を使用する必要があります。
public Exception(string Message, Exception InnerException);
2番目のパラメーターは、この「内部例外」を指定します。ユーザー定義の例外の場合は、通常、構築メソッドを指定する必要があり、内部例外をパラメーターで指定できます。
この例では、異常なリンクに対して内部例外を使用しています。
using System;
public class DataHouse
{
public static void FindData(long ID) {
if (ID > 0 && ID < 1000)
Console.WriteLine(ID);
else
throw new DataHouseException("已收到文件尾");
}
}
public class BankATM
{
public static void GetBalanceInfo(long ID) {
try {
DataHouse.FindData(ID);
} catch (DataHouseException e) {
throw new MyAppException("账号不存在", e);
}
}
}
public class DataHouseException : ApplicationException
{
public DataHouseException(string message) : base(message) {
}
}
public class MyAppException : ApplicationException
{
public MyAppException(string message) : base(message) {
}
public MyAppException(string message, Exception inner) : base(message, inner) {
}
}
class Program
{
static void Main(string[] args) {
Console.WriteLine("Hello World!");
try {
BankATM.GetBalanceInfo(12345L);
} catch (Exception e) {
Console.WriteLine("出现了异常: {0}", e.Message);
Console.WriteLine("内部原因: {0}", e.InnerException.Message);
}
}
}