Csharp-exception-handling
C#-例外処理
例外は、プログラムの実行中に発生する問題です。 C#例外は、ゼロ除算の試行など、プログラムの実行中に発生する例外的な状況への応答です。
例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 C#例外処理は、 try 、 catch 、 finally 、および throw の4つのキーワードに基づいて構築されています。
- try -tryブロックは、特定の例外がアクティブになるコードのブロックを識別します。 その後に1つ以上のcatchブロックが続きます。
- catch -プログラムは、問題を処理するプログラム内の場所で例外ハンドラーを使用して例外をキャッチします。 catchキーワードは、例外のキャッチを示します。
- finally -finallyブロックは、例外がスローされるかどうかに関係なく、指定された一連のステートメントを実行するために使用されます。 たとえば、ファイルを開く場合は、例外が発生したかどうかにかかわらず、ファイルを閉じる必要があります。
- throw -問題が発生すると、プログラムは例外をスローします。 これは、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* クラスは、事前定義されたすべてのシステム例外の基本クラスです。
次の表は、Sytem.SystemExceptionクラスから派生した定義済みの例外クラスの一部を示しています-
Sr.No. | Exception Class & Description |
---|---|
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 、 catch 、および finally キーワードを使用して実装されます。 以下は、ゼロ条件による除算が発生したときに例外をスローする例です-
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(Exception e) {
...
Throw e
}