ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12114  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

え~と私は使うの大好きです。というのは例外処理で楽できるから。

例外 (exception) を嫌っている人も多いと思いますが、そもそも例外って何で生まれたのでしょう?
古の C では例外なんて無かったと聞いています。そのころの coding は下記のような感じですね。


if (処理1)
{
    例外処理1
}
if (処理2)
{
    例外処理2
}

この場合、処理の数だけ例外処理を書かないといけませんね。ついでに戻ってくるのは数値なのでより詳細な情報を得るためにはさらに別の関数 (Win32 であれば GetLastError ついでに FormatMessage) を呼び出す必要があります。実際問題非常に面倒です。

例外処理が共通な場合、「例外処理1」と「例外処理2」は一致するわけです。同じものを複数書くのは非常に無駄ですね。これを例外を使ってやってみるとどうなるでしょう。


try
{
    処理1
    処理2
}
catch (例外)
{
    例外処理
}

非常に simple にまとまりましたね。それだけではなく、例外を使うことによって得られる利点には下記のものがあります。

  • 上位呼び出し元への伝播が自動的に行われる
  • 標準の例外 object を利用することにより処理の共通化が図れる
  • Error code 以外の情報を得るのが容易

大体こんなものがあると思います。

間違いなく確かなことは標準的な例外を利用することによって例外処理が容易にかつ効率的に間違いなく実装できるんです。これだけの利点があります。

ではなぜ例外を忌み嫌っている人がいるのでしょう?

その理由としては例外がかなり重い処理であるということです。興味がある方は mxb さんが以前解説されているので聴いてみてください。

Exceptionのしくみ

したがって、処理速度がほかの何よりも要求される要件では例外を使うべきでないでしょう。しかし、例外を使わないと処理が複雑化する場合が多いです。複雑化すると当然それだけ bug が生まれやすくなります。それに例外には先述説明したような利点があります。実際問題どうするべきでしょう?

個人的には例外を利用しない利点としては performance tuning のためくらいしか理由が見当たりません。なので、先述説明したような例外を利用する利点と performance tuning で得られる効果を見比べてその要件に対し、どちらが効果があるかで選択するべきでしょう。

個人的には milli seconds 単位の performance tuning が求められる要件でもない限り例外を積極的に利用しない理由はないんじゃないかと思います。

ただし、例外を確実に回避する簡単な方法が用意されているのにそれを利用しないのはどうかと思いますねぇ。TryParse を利用していないのは正直どうかと。

う~む。まとまっていないなぁ。。。

ちなみにこいつを書いたきっかけはこちら

ファイルのチェック

投稿日時 : 2008年3月2日 23:24

コメント

# re: 例外 2008/03/03 9:42 シャノン
前のコードを後のコードに置き換えることはできませんよね。

前のコードで、例外処理の中に return が入っているケースでは、個別の処理に失敗したから、全体としてそれ以上継続できないということになります。
この場合、例外処理の部分にはリソースの後始末が入ることが多いですが、それは C++ のデストラクタやガベージコレクタ、あるいは finally 機構によって始末されます。必ずしも例外は必要ではありません。

前のコードで、例外処理の中に return が入っていないケースでは、処理失敗を何らかの形でフォローして次の処理に進まなければならないのですが、この場合、例外ハンドラに飛んでしまうと、フォローアップの上で処理再開ということができません。

どうも、「エラー処理をまとめることができる」という例外の使い方には無理があるんじゃないかと思いますが、どうでしょうね?

# re: 例外 2008/03/03 10:57 mxb
ルートであるSystem.Exceptionを呼び出すと重くなるのは確かです。
しかし、業務プログラムとは限らず、フリーソフトでも例外発生画面(メッセージボックスを含む)をそのままユーザに表示するのは...と思います。
ms単位で速度が求められる物ほどそういったユーザインターフェイスにはうるさいと思います。
適材適所に最小限のExceptionを使用して、最終的に親クラスなどで一括して捉えるほうが取りこぼしがなくなると思います。
親クラスでもサブクラス毎にメッセージを呼び出していると重くなるので、Errorクラスなどを呼び出し、そこで一括して出力するほうが設計もコーディングも楽になると思います。
これらのクラスを自動的に使用させるためにアプリケーションフレームワークの実装なども視野に入れた設計が必要となりますね。
結局、基本設計時点で入出力設計が肝心です。
設計時は往々にして正常系にばかり目が行きがちですが、異常、警告系への対応をいかに正確に、迅速に対策させるための情報をいかに綺麗に出力するかが大切だと思います。

# re: 例外 2008/03/04 2:28 ちゃっぴ
> 前のコードを後のコードに置き換えることはできませんよね。

そういうのは共通の例外処理ではないので、素直に block 小さくすればいいでしょう。

> 適材適所に最小限のExceptionを使用して、最終的に親クラスなどで一括して捉えるほうが取りこぼしがなくなると思います。

そうなんですよ。
「上位呼び出し元への伝播が自動的に行われる」のが取りこぼしを少なくする効果がありますね。
どんなに深い呼び出しを行っていても、途中で握りつぶしていなければ最上位で補足でも補足できるわけですから。

Post Feedback

タイトル
名前
Url:
コメント