例外処理


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。



try-catch-finallyによって投げられた例外を受け取り処理することができます。


try{
	// ... 例外を発生させるような処理
	var datas = new object[10];
 
	var obj = datas[11]; // IndexOutOfRangeException 例外がスロー
}catch(IndexOutOfRangeException e){
	// 例外を対処するためのコード
}catch(Exception e){
	// 例外を対処するためのコード
}finally{
	// finallyブロックは、
	// 例外が発生しなかった場合でも呼び出される。
}
 

IndexOutOfRangeExceptionクラスはExceptionクラスをサブクラスに持つため、上記のように例外構文を記述した場合、両方の例外ブロックにマッチしますが、実行されるのは最初にマッチした例外ブロックのみです。


2つのカテゴリ [#s3642dbd]


SystemException
システムで使用される例外。ライブラリ間で共通されるべき例外。~
また、SystemExceptionをスーパークラスとして新たなシステム例外は作成してはいけません。
ApplicationException
アプリケーション固有の例外。開発者はこの例外を外部にスローしないように気をつける。~
ライブラリ開発でやむを得ず独自の例外が必要となった場合は、発生理由や例外の回避方法、復旧方法をできるだけ詳しいドキュメントで公開しておくべき。


SystemException [#s0773bb3]


通常のプログラム開発に於いて、開発者が利用するであろうシステム例外は下記の通りです。

ArgumentException メソッドに渡された引数が無効である場合にスローする。ただし、nullである場合を除く。
ArgumentNullException メソッドに渡された引数に、nullが含まれている場合にスローする。
IndexOutOfRangeException 配列やプロパティで連続したデータの範囲外にアクセス使用とした場合にスローする。
NotImplementedException 実装されていないメソッドである場合にスローする。

NotImplementedException例外は、開発者が本来実装しなければならない実装を、一時的に後回しにしてしまう場合に、「まだ実装してないことをマークし、例外として警告する」ために使用します。

interface IDataAccess {
	bool SaveEntity(Person data);
}
 
public class BackendDataAccess : IDataAccess {
	public bool SaveEntity(Person data) {
		// TODO: 開発チーム「佐藤くん」が実装予定のメソッドなので、
		//       今のところは未実装状態にしておきます。
		throw new NotImplementedException();
	}
}
}
 

WPFでの未処理の例外


未処理の例外があった場合、Application.DispatcherUnhandledExceptionイベントが呼び出される。

Handledプロパティを設定しないと、永久にDispatcherUnhandledExceptionイベントが呼び出してしまう例外もあるので注意。

private void OnDispatcherUnhandledException(object sender,
	System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) {
 
	e.Handled = true; // 例外を処理したことを通知
 
	Shutdown(); // アプリケーションを終了
}
 


LINQでの例外処理


LINQも例外を投げます。~
ただし、LINQは遅延実行を行うため、LINQを定義した場所に例外構文を記述するのではなくLINQを実行する箇所で例外をキャッチしなければなりません。

var b = from p in MyLists
		select p;
 
foreach(Data obj in b){
	Console.WriteLine(obj);
}
 

このように定義したLINQが実行時に発生する例外のキャッチには、次のようにforeachステートメントの部分で行います。

try{
	foreach(Data obj in b) {
		Console.WriteLine(obj);
	}
}catch(Exception e){
}
 

読んでいる本


Effective C#

QLOOKアクセス解析

ここを編集