11月9日(火)1、2コマ目
今日、やったこと
- 前回の課題(C#+トランザクション)の解説
- 例外処理の話(C#)
今日のホワイトボード
前回の課題(C#+トランザクション)の解説
採点して、以下が気になりました。
- 変更対象のIDと数量を別々の変数で扱う
- 1商品毎にコミット、ロールバックをする
| 図 採点して気になったところ |
ソースコードをあげておきます。
StockDAO.cs
Index.cshtml
Index.cshtml.cs
例外処理について
処理終了時の状態
処理終了時は
- 正常終了
- 異常終了
の2つに分かれる。
さらに、異常終了は
- 想定内のエラー
- 想定外のエラー
に分類し、想定内のエラーを業務エラー、想定外のエラーを例外と呼ぶ。
ただ、想定外のエラー(例外)はよくよく考えるとすべて想定内のエラー(業務エラー)にすることができる。
そこで、想定内のエラー(業務エラー)は
ユーザーに通知してリカバリをしてほしい(できる)エラー
と再定義する。例えば、入力内容がおかしい場合など。
想定外のエラー(例外)は
ユーザーに通知してもリカバリできないエラー
とする。例えば、DB接続に失敗したなど。
| 図 処理終了時の状態 |
処理終了時の状態をどうやって伝える
C#ではメソッド呼び出し元に通知する手段として
- 戻り値
- 例外スロー
が使える。これらをうまく使い分けることが今回のポイント。
| 図 処理終了時の状態を通知する手段 |
例外スロー時
一番ダメなのは、
例外をキャッチして、なにもしない(catchブロック内が空)
です。
例外スロー時にやることがあるときだけ、try{}catch{}を使うこと。
なにもないなら、例外は呼び出し元へスローすること。
| 図 例外スロー時は |
DBアクセス時にエラーが発生したら
オラクルの場合、エラーコード(ORA-xxxxx)が返される。
プログラム上では、OracleExceptionがスローされる。Numberプロパティに5ケタのエラーコード(xxxxxの部分)がセットされている。
| 図 DBアクセス時にエラーが発生すると |
サンプルソース
ユーザー登録を行うサンプルを作成しました。
ユーザー登録の際、
- IDが重複した
- パスワードが短い
のエラーが発生します(想定内のエラー)。
UsersInsertResultEnum
ユーザー登録結果を通知するための列挙型
列挙型とは定数のセットと思っていただければ。