C# 入門 & 実践 / C sharp
4-24. 例外処理 - 2 - 独自の例外オブジェクトを作る。
1. 独自の例外オブジェクトを作成
2. catch 側でも分ける。
3. InnerException を使用する。
1. 独自の例外オブジェクトを作成
独自の例外オブジェクトは System.ApplicationException から派生して作成します!
BbException というクラスを作成して
Test() 内でスローさせてみます。
class BbException : System.ApplicationException
{
// メッセージの始めにクラス名を付けてみただけ。
public BbException(string msg):base( "BbException : " + msg)
{
}
}
class MyException
{
public void Test()
{
Console.WriteLine("Test() : メソッドが呼ばれました。");
// エラーをスローします!
// BbException を利用してみます!
throw new BbException("エラーが出たよ");
}
static void Main()
{
try
{
MyException me = new MyException();
Console.WriteLine("try : メソッドを呼び出します。");
// エラーをスローさせます。
me.Test();
Console.WriteLine("try : メソッドは無事終了しました。");
}
catch( Exception e )
{
// Exception は全ての例外をキャッチします!
Console.WriteLine("catch( Exception e) : エラーがスローされた.");
Console.WriteLine("catch( Exception e) : {0}" , e.Message );
}
finally
{
Console.WriteLine("finally : try catch の全ての処理後に呼ばれます。");
}
}
}
try : メソッドを呼び出します。
Test() : メソッドが呼ばれました。
catch( Exception e) : エラーがスローされた.
catch( Exception e) : BbException : エラーが出たよ
finally : try catch の全ての処理後に呼ばれます。
先ほどとほぼ同じですが、BbException : がメッセージの前に付いています。
2. catch 側でも分ける。
catch 句を一つ増やします
catch ( Exception e) は、すべての例外をキャッチしましたが
catch ( BbException e) は、BbException が投げられたときだけ処理を行います。
static void Main()
{
try
{
MyException me = new MyException();
Console.WriteLine("try : メソッドを呼び出します。");
// エラーをスローさせます。
me.Test();
Console.WriteLine("try : メソッドは無事終了しました。");
}
catch ( BbException e)
{
// BbException
Console.WriteLine("catch( BbException e) : BbException がスローされた! ");
Console.WriteLine("catch( BbException e) : {0}", e.Message);
}
catch (Exception e)
{
// Exception は全ての例外をキャッチします!
Console.WriteLine("catch( Exception e) : エラーがスローされた.");
Console.WriteLine("catch( Exception e) : {0}", e.Message);
}
finally
{
Console.WriteLine("finally : try catch の全ての処理後に呼ばれます。");
}
}
3. InnerException を使用する。
Testで出た例外を保持したまま Test2 で新しい例外を投げます!
何重にも入れ子して while で呼び出しも可能。
class BbException : System.ApplicationException
{
public BbException(string msg)
: base("BbException : " + msg)
{
}
// innerException を使う用。
public BbException(string msg, Exception inner )
: base( msg, inner )
{
}
}
class MyException
{
public void Test()
{
Console.WriteLine("Test() : メソッドが呼ばれました。");
// エラーをスローします!
// BbException を利用してみます!
throw new BbException("エラーが出たよ");
}
public void Test2()
{
try
{
this.Test();
}
catch (Exception e)
{
string s = "Test2 でエラー : さらに innerException もあるよ!";
BbException e2 = new BbException("Test 2 でエラーだよ。", e);
throw e2;
}
}
static void Main()
{
try
{
MyException me = new MyException();
Console.WriteLine("try : メソッドを呼び出します。");
// Test2 を呼んでみる。
me.Test2();
Console.WriteLine("try : メソッドは無事終了しました。");
}
catch ( BbException e)
{
// BbException
Console.WriteLine("catch( BbException e) : BbException がスローされた! ");
Console.WriteLine("catch( BbException e) : {0}", e.Message);
Exception inner = e.InnerException;
if (inner != null)
{
Console.WriteLine("catch( BbException e) : InnerException : {0}", inner.Message);
}
}
catch (Exception e)
{
// Exception は全ての例外をキャッチします!
Console.WriteLine("catch( Exception e) : エラーがスローされた.");
Console.WriteLine("catch( Exception e) : {0}", e.Message);
}
finally
{
Console.WriteLine("finally : try catch の全ての処理後に呼ばれます。");
}
}
try : メソッドを呼び出します。
Test() : メソッドが呼ばれました。
catch( BbException e) : BbException がスローされた!
catch( BbException e) : Test 2 でエラーだよ。
catch( BbException e) : InnerException : BbException : エラーが出たよ
finally : try catch の全ての処理後に呼ばれます。
ここでは、独自のクラスにしていますが、 InnerException は普通に Exception で使用できます。
4-23. 例外処理 - 1 - try catch finally «
4. C# 入門 Level 2 »
4-25. デリゲート と イベント - 1 - デリゲートって何ですか?
C# 入門 & 実践 / C sharp