2018年2月8日木曜日

Catch 句を空にするのは例外をなかったことにすること

.NET Framework では例外の捕捉には Try-Catch を使用しますが、正しく利用されていないのをときどきみかけます。誤った例外処理は補足すべき例外を見逃したり、例外情報を取得できなくなったりする原因になります。

※これは2013年に書いたものです。


空の Catch


社内の開発プロジェクトから CDI を依頼されたとき、次のようなソースコードを発見しました。
Try
    ' 処理(この記事では関係がないので割愛します)
Catch ex As Exception
    ' 何もしない
End Try

何もしないというのはどういうことかをプログラマに質問したところ、「サンプルのソースコードでは例外が発生したときには○○をする処理が書かれていたけれど、ここでは何もする必要がないため削除しました」 とのことでした。

上記のコードでは発生した例外をキャッチした後は何もしないという動作になり、例外は発生しなかったものとして以降の処理が継続されます。Exception 型でキャッチしていますので、全ての例外が無視されます。不正な状態で処理が継続されることによって不正なデータ更新が行われてしまったりするため、非常に問題です。

Catch の役割


例外が発生したときに何らかの処理を行う必要がないのであれば Try-Catch 自体が不要です。例外が発生する可能性があり、発生した場合は不正な状態から復帰させてアプリケーションの動作を継続させたいという場合にのみ、Try-Catch を用いてその例外に対する処理を記述するようにします。 むやみやたらと Try-Catch したり、Exception 型を対象に全ての例外をキャッチしたり、Finally 句が適切に使われていなかったりと、例外の捕捉については周知が必要なことが多いですね。

 マイクロソフトのコンサルタントの方のブログに例外処理について説明されている記事があります。特に開発プロジェクトテンプレートやコーディングルールを作成するにあたって例外処理についてしっかり理解しておきたいという人は見ておくとよいと思います。

とあるコンサルタントのつぶやき -- .NETの例外処理 Part.1~4
.NETの例外処理 Part.1
.NETの例外処理 Part.2
.NETの例外処理 Part.3
.NETの例外処理 Part.4 
 

0 件のコメント:

コメントを投稿

paiza のスキルチェックをやってみました

いまさら感はありますが、 paiza のスキルチェックをやってみました。指定された時間内にコードを書いてユニットテストにかけ、その結果を基に評価を数値化してくれるというものですが、ゲーム感覚で空き時間を見つけて進めていこうと考えています。 どうやら時間が短いほど高い評価を得...