C# - 例外処理
例外は、プログラムの実行中に発生する問題です。 C# 例外は、ゼロ除算など、プログラムの実行中に発生する例外的な状況への応答です。
例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 C# の例外処理は、try の 4 つのキーワードに基づいて構築されています。 、キャッチ 、ついに 、投げる .
-
試す − try ブロックは、特定の例外がアクティブ化されるコードのブロックを識別します。その後に 1 つ以上の catch ブロックが続きます。
-
キャッチ − プログラムは、問題を処理したいプログラム内の場所で、例外ハンドラーを使用して例外をキャッチします。 catch キーワードは、例外のキャッチを示します。
-
ついに - finally ブロックは、例外がスローされるかどうかに関係なく、特定の一連のステートメントを実行するために使用されます。たとえば、ファイルを開く場合、例外が発生するかどうかにかかわらず、ファイルを閉じる必要があります。
-
投げる − 問題が発生すると、プログラムは例外をスローします。これは throw キーワードを使用して行われます。
構文
ブロックが例外を発生させると仮定すると、メソッドは try キーワードと catch キーワードの組み合わせを使用して例外をキャッチします。例外を生成する可能性のあるコードの周りに try/catch ブロックが配置されます。 try/catch ブロック内のコードは保護されたコードと呼ばれ、try/catch を使用するための構文は次のようになります −
try {
// statements causing exception
} catch( ExceptionName e1 ) {
// error handling code
} catch( ExceptionName e2 ) {
// error handling code
} catch( ExceptionName eN ) {
// error handling code
} finally {
// statements to be executed
}
try ブロックがさまざまな状況で複数の例外を発生させた場合に備えて、複数の catch ステートメントをリストして、さまざまな種類の例外をキャッチできます。
C# の例外クラス
C# の例外は、クラスによって表されます。 C# の例外クラスは、主に System.Exception から直接的または間接的に派生しています。 クラス。 System.Exception クラスから派生した例外クラスの一部は、System.ApplicationException です。 および System.SystemException クラス。
System.ApplicationException クラスは、アプリケーション プログラムによって生成される例外をサポートします。したがって、プログラマによって定義された例外は、このクラスから派生する必要があります。
System.SystemException class は、事前定義されたすべてのシステム例外の基本クラスです。
次の表は、Sytem.SystemException クラスから派生した定義済みの例外クラスの一部を示しています −
| Sr.No. | 例外クラスと説明 |
|---|---|
| 1 | System.IO.IOException I/O エラーを処理します。 |
| 2 | System.IndexOutOfRangeException メソッドが範囲外の配列インデックスを参照するときに生成されるエラーを処理します。 |
| 3 | System.ArrayTypeMismatchException 型が配列型と一致しない場合に生成されるエラーを処理します。 |
| 4 | System.NullReferenceException null オブジェクトの参照から生成されたエラーを処理します。 |
| 5 | System.DivideByZeroException 被除数をゼロで除算して発生したエラーを処理します。 |
| 6 | System.InvalidCastException 型キャスト中に生成されたエラーを処理します。 |
| 7 | System.OutOfMemoryException 空きメモリ不足から発生したエラーを処理します。 |
| 8 | System.StackOverflowException スタック オーバーフローから生成されたエラーを処理します。 |
例外の処理
C# は、try ブロックと catch ブロックの形式で、例外処理に対する構造化されたソリューションを提供します。これらのブロックを使用して、コア プログラム ステートメントをエラー処理ステートメントから分離します。
これらのエラー処理ブロックは、try を使用して実装されます 、キャッチ 、そして最後に キーワード。以下は、ゼロ除算条件が発生したときに例外をスローする例です-
ライブデモ
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int result;
DivNumbers() {
result = 0;
}
public void division(int num1, int num2) {
try {
result = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Exception caught: {0}", e);
} finally {
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args) {
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ... Result: 0
ユーザー定義の例外の作成
独自の例外を定義することもできます。ユーザー定義の例外クラスは Exception から派生します クラス。次の例はこれを示しています-
ライブデモ
using System;
namespace UserDefinedException {
class TestTemperature {
static void Main(string[] args) {
Temperature temp = new Temperature();
try {
temp.showTemp();
} catch(TempIsZeroException e) {
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: Exception {
public TempIsZeroException(string message): base(message) {
}
}
public class Temperature {
int temperature = 0;
public void showTemp() {
if(temperature == 0) {
throw (new TempIsZeroException("Zero Temperature found"));
} else {
Console.WriteLine("Temperature: {0}", temperature);
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます −
TempIsZeroException: Zero Temperature found
物を投げる
System.Exception から直接的または間接的に派生している場合、オブジェクトをスローできます。 クラス。 catchブロックでthrowステートメントを使用して、現在のオブジェクトを次のようにスローできます-
Catch(Exception e) {
...
Throw e
}
C言語