C# の例外処理は、try、catch、finally、throw という 4 つのキーワードに基づいて構築されています。
- try: try ステートメント ブロックは通常、例外が発生しやすいコードを格納するために使用され、その後に 1 つ以上の catch ステートメント ブロックが続きます。
- catch: catch ステートメント ブロックは、try ステートメント ブロックで発生した例外をキャッチするために使用されます。
- finally:finally ステートメント ブロックは、例外がスローされるかどうかに関係なく、特定のステートメントを実行するために使用されます。
- throw: throw は例外をスローするために使用されます。
try/catch ステートメント
コードの一部が例外をスローすると仮定すると、try と catch の組み合わせを使用して例外をキャッチできます。その構文は次のとおりです。
try{
}catch( ExceptionName e1 ){
}catch( ExceptionName e2 ){
}
…
catch( ExceptionName eN ){
}finally{
//
}
上に示したように、複数の catch ステートメント ブロックをリストしてさまざまな種類の例外をキャッチし、異なる状況で try ステートメント ブロックが複数の例外を生成するのを防ぐことができます。
[例] try/catch ステートメントを使用してプログラム内の例外をキャッチします。
using System;
namespace it-kiso.com
{
class Demo
{
static void Main(string[] args)
{
try{
int a = 123;
int b = 0;
int x = a / b;
}catch (Exception e) {
Console.WriteLine("捕捉到的例外:{0}", e);
}finally{
Console.WriteLine("finally语句块中的代码");
}
Console.WriteLine("程序中的其它代码");
}
}
}
C# の例外クラス
C# の例外クラスは主に System.Exception クラスから派生しています。たとえば、2 つの例外クラス System.ApplicationException と System.SystemException は System.Exception クラスから派生しています。
- System.ApplicationException クラスはプログラムによって生成された例外をサポートするため、カスタム例外はこのクラスを継承する必要があります。
- System.SystemException クラスは、すべてのシステム事前定義例外の基本クラスです。
Sytem.SystemException クラスから派生したいくつかの事前定義例外クラスを次の表に示します。
例外クラス | 説明 |
---|---|
System.IO.IOException | I/Oエラーの処理 |
System.IndexOutOfRangeException | メソッドが範囲外の配列インデックスを参照したときに生成されるエラーを処理します。 |
System.ArrayTypeMismatchException | 配列の型が一致しない場合のエラーを処理します |
System.NullReferenceException | null オブジェクトを参照する際のエラーを処理します。 |
System.DivideByZeroException | ゼロ除算時のエラーを処理する |
System.InvalidCastException | 型変換中に生成されたエラーを処理する |
System.OutOfMemoryException | 空きメモリ不足によるエラーの処理 |
System.StackOverflowException | スタック オーバーフローによるエラーを処理する |
カスタム例外クラス
システムによって事前定義された例外クラスを使用することに加えて、独自に例外クラスを定義することもできます。カスタム例外クラスは System.ApplicationException クラスを継承する必要があります。次の例は、カスタム例外クラスの使用を示しています。
using System;
namespace it-kiso.com
{
class Demo
{
static void Main(string[] args)
{
TestUserDefinedException test = new TestUserDefinedException();
try{
test.validate(12);
}catch(InvalidAgeException e){
Console.WriteLine("InvalidAgeException: {0}", e);
}
Console.WriteLine("その他のコード");
}
}
}
public class InvalidAgeException : ApplicationException
{
public InvalidAgeException (string message): base(message)
{
}
}
public class TestUserDefinedException
{
public void validate(int age)
{
if(age < 18)
{
throw (new InvalidAgeException("申し訳ありませんが、年齢は18歳以上でなければなりません"));
}
}
}
操作の結果は次のようになります。
InvalidAgeException: InvalidAgeException: 申し訳ありませんが、年齢は18歳以上でなければなりません
TestUserDefinedException.validate(Int32 age)
it-kiso.com.Demo.Main(String[] args)

例外が System.Exception クラスから直接的または間接的に派生している場合は、catch ステートメント ブロックの throw ステートメントを使用して例外をスローできます。ここでのいわゆる例外のスローは、例外を再スローすることと理解できます。 throw ステートメントの構文は次のとおりです。
catch(Exception e) {
…
Throw e
}