[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 1474] Re: assertion 、事前 条件の例外スロー方法
前橋です。
高橋さん:
>「達人プログラマー」の22節死んだプログラムは嘘をつかない
> ヒント32:早めにクラッシュさせること
>ですね。ろくな結果がでないだけでなく、バグがある場所がどこか分かり
>にくくしてしまいますね。
その通りだと思います。
ところで、「達人プログラマー」とは書籍でしょうか?
読んでみたいような... よろしければ詳細を教えてくださいませ。
>> だから、assertでは、RuntimeExceptionを投げるどころか、スタックトレースを
>> 吐いてSystem.exit()しちゃってもいいぐらいだと思います。JavaOSで動いてる
>> とかでなければ。
>開発・デバッグ時はそうなんですが、運用中はたとえバグが原因であっても
>止まってほしくないのです。生き続けられる限りは生き続けて欲しい。。。
>その代わり、詳細な情報をログに吐いておかないと、後でバグを究明できな
>くなりますが。
バグありプログラムをとっとと殺すのは、原因究明のためもあります
けど、「さらにろくでもないことをしでかす前に殺してしまえ」という
のもあるわけです。
たとえば CADで形状設計をしていて、ある時突然 System.exit() して
半日分の作業内容が吹っ飛んだらユーザさんは悲しいですが、
半年かけて作ったデータがバグのおかげで「よれていて」、後工程に
回せなかったら、もっと困るように思います。
実際のところ、後者のようになるのは確率的には低いわけで、
年に1回、データがよれて決定的に困るのと、1日1回 System.exit()で
コケるのと、どっちが困るのかといえば後者かも知れませんが、
1日1回コケるような代物は出荷しちゃいけないわけで、
System.exit()を大量に入れたコーディングで、通常の使用では
まずコケないレベルまではデバッグすべきでは? と思うわけです。
UNIXのカーネルは、決定的におかしいと思ったときにはpanic()しますよね。
>> もちろん、呼び出され側である程度の処理をしないと引数の妥当性が
>> わからない、だから、呼び出し側では、とりあえず呼んでみて
>> IllegalArgumentExceptionをcatchする、というケースは話が別ですが。
>うーん、これはまずいです。エラーチェックはやっぱり呼び出し側で
>行わないと。。。妥当性をどうしても相手側に判断してもらわなければ
>ならない場合は、妥当性チェックメソッドを用意すべきと思います。
はい。この例は、「こういう場合ならIllegalArgumentExceptionをcatch
するのも妥当だろう」という例で挙げたので、こういう場合自体を避ける
なら、それはそれでよいと思います。
でも、マルチスレッド環境では、妥当性チェックメソッドではまずい
こともありそう。
>> Javaの場合、基本的に領域破壊はないので、「あっちの方はバグってる
>> けど、こっちはまだ元気」ということを期待してもよいのかもしれません。
>これはC/Javaというよりか、モジュールの作り方・独立性によると思います。
>他のクラス(インスタンス)を利用しまくっていれば、壊れたインスタンスを
>呼び出してしまうわけですし(壊れたインスタンスからも呼ばれるなぁ。。。)
うむむ。C の場合、どんなにきれいにモジュール分けしても、
同一実行形式にリンクされている限り、ちょっと配列がオーバランしたり
するだけでよそのモジュールだろうがなんだろうが簡単にぶっ壊して
くれますから、やはり危険度は違うように思います。
>> try {
>> 処理;
>> } catch (Exception ex) {
>> ;
>> }
>>
>> こんなことされてちゃ困るなあ... そのぐらいならいっそ、Errorを
>> 投げる方がより確実かも。
>Javaの入門書や雑誌にこんなコードがあふれているのが問題・・・
>それを見て、平気でこんなコードを書くようになってしまう。
せめて、
try {
処理;
} catch (Exception ex) {
ex.printStackTrace();
System.exit(1);
}
こうなっていれば、私なら許すんですが。
>ちょっと面白いWebページがありました。
>「勉強用のサンプルは低レベルなものが多い」
>http://www.st.rim.or.jp/~k-kazuma/SD/SD201.html
>エラー処理の話しではないですが、開発環境や雑誌のサンプルをまねてしまう
>問題が載っています。
ぎくっ!
ああ、でももう金曜には印刷に回されてしまう... (^^;
>フレームワーク側にどこまで強度さ(頑健さ)を求めるかにもよりますが。
>危ないプログラムは排除するような仕組みはおもしろそうです。
>次世代の言語ではこのような機構があるといいな。。。
>#Unsafe Programming Exception: このクラスはフレームワークを
>#誤って使っています。アンロードされました。
Javaなら可能なような気もするのですが。
スタック上に、フレームワークとアプレットが交互に積み重なるような
形になってしまう場合の対応をきちんと決めておけば...
------------------------------------------------------------
前橋 和弥 maebashi@xxxxxxxxx
http://member.nifty.ne.jp/maebashi/
------------------------------------------------------------