例外処理
最終更新:
atachi
-
view
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を実行する箇所で例外をキャッチしなければなりません。
ただし、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){
}