トップページ⇒tech
405コメント110KB

ボボボーボ・ボクは例外処理が嫌いなんだな

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
他人が作ったクラスとかだと例外のキャッチし忘れ多過ぎ
何の例外が飛んでくるかわからないクラスなんて怖くて使えない

そもそも例外処理って大域ジャンプだろ、
そんなもの怖くて使えねーよ
0237デフォルトの名無しさんNGNG
IDEに組み込まれたTODOってDelphiの昔から存在するような気がするが
0238デフォルトの名無しさんNGNG
BorlandはMSとクロスライセンス契約を結んでるから無問題

http://japan.cnet.com/news/ent/story/0,2000047623,20069128,00.htm
0239デフォルトの名無しさんNGNG
申請前から広く使われていた周知の技術って、無効じゃないか?
0240デフォルトの名無しさんNGNG
そう思うならそう申請するしかない
0241デフォルトの名無しさんNGNG
>>239
そうです。
日本の特許庁の立場は、それは裁判所の扱う問題で、
特許庁は、初めての申請であればそれを受理する、というものです。

0242デフォルトの名無しさんNGNG
>>236
Eclipse3.0ではそのと挙問題を見事に解決しているぞ。
もうひとつ種類の異なるウィンドウに表示されるようになることで
解決したんだから無問題
0243デフォルトの名無しさんNGNG
>>235
それだったらCode Templatesを自作してしまえばいい。
コードアシスト機能でもパターンを追加すると楽だ。

それと、Jakarta Velocityも使え。

EclipseのVelicity UIプラグイン、 Simteecプラグインを使うと楽だ。
0244デフォルトの名無しさんNGNG
>>241
JavaScriptのポップアップ特許を思い出したよ。
無効になったけどなw
0245デフォルトの名無しさんNGNG
例外って関数外へのthrowを禁止した方が
使える気がする。
0246デフォルトの名無しさんNGNG
頼むからネタだといって
0247デフォルトの名無しさんNGNG
予言しよう!
>245は次に、例外使った処理ジャンプを「発明」する!
0248デフォルトの名無しさんNGNG
自分の経験からすると、一般のアプリケーションレベルのコードでは
そこが源流となる例外を放つケースは無いと断言出来る。
例外は全てその下のレイヤー(APIとか標準ライブラリ)から飛んでくる。
そして、それらの例外は復旧不能なものが殆どで、例外が起きた時点でアボーンが常。
だったら、自分の書くコードでは関数外例外は禁止した方が
書くコード量が減って見やすくなっていいんじゃないかにゃ〜ん
0249デフォルトの名無しさんNGNG
関数外へ飛び出すのを禁じた例外か・・・
ちょっと欲しい
0250デフォルトの名無しさんNGNG
>>248-249
ドカタ作業ばっかやってると偏るぞ……
例外もいちど復習してこいや
0251デフォルトの名無しさんNGNG
お前の書くコードは、エントリから終わりまで1関数なのか?
いくらドカタでも、そんなコードばっかり書いてると首になるぞ?
0252デフォルトの名無しさんNGNG
>>248
ムダな経験だたネ
0253デフォルトの名無しさんNGNG
スレタイからして糞スレかと思ったら、意外に良スレでワロタ
0254デフォルトの名無しさんNGNG
>>248
同意
アプリケーションレベルのオブジェクト間通信って関数呼び出しだけに
マッピングするとは限らんので、エラー通知の汎用的な解として
例外はいまいちしっくりこない。
全部例外安全にするのもコスト(コード的にも、実行時的にも)がかかりすぎるし、
そうでない場合は、関数呼び出し順序等に強い依存関係が生まれそうでこわい。
0255デフォルトの名無しさんNGNG
>>248>>254
まとめて逝って良し

プログラマの裁量範囲でうまく使え
0256デフォルトの名無しさんNGNG
>>255
裁量範囲で例外は使いません。
0257デフォルトの名無しさんNGNG
>>256
裁量って何か知ってるか?
0258デフォルトの名無しさんNGNG
>>254
> 全部例外安全にするのもコスト(コード的にも、実行時的にも)がかかりすぎるし、

同じことを、

result1 = func1(arg11, ...);
if (result == -1) {
// ああした
}
result2 = func2(arg21, ...);
if (result2 == -1) {
// こうした
}

でやるより簡単だから、例外が最近の言語にはあるんだが。
callerで処理すれば済めば簡単なんだが、
callerのcallerのcallerで処理しないと行けない場合大変だ。

実際qmailのコードをみるとほとんどがエラー処理だ。
機能をprocessに分割しているserverでもまじめに書くとああなる。

0259デフォルトの名無しさんNGNG
まぁ趣味でやってる人は例外使わなくてもいいんじゃないの?

0260デフォルトの名無しさんNGNG
言葉が足りなかった。私が言いたいのは強い例外安全
(呼び出し前と例外発生後で状態の変化がない事)の事です。

>>258
func1の実装とそれを呼び出している実装の関係が汎用ライブラリのコードと
アプリケーションコードの関係だってんなら同意するけど。
コンテキストを多く持つAppレベルのオブジェクトの場合、強い例外安全を
各メソッドで実現するコストが高すぎるってのが、私の感覚。
勿論、全メソッドで強い例外安全を確保して再利用性を高めうようって発想も
わかるけど、そもそも、Appレベルのコードって再利用する事自体少ないし。
ライブラリってんなら話は別だけど。
0261254=260NGNG
ageてしまった。sry
0262デフォルトの名無しさんNGNG
>>258
まあ>>258のコードは冗長だけど
見通しは良いわな。

try{
func1(...);
func2(...);
func3(...);
func4(...);}
catch( exception1 e){ ...}
catch( exception2 e){ ...}
catch( exception3 e){ ...}
catch( exception4 e){ ...}

これでは、すっきりしているが相関がわからない。
そこいら辺の情報がスッポリ抜け落ちているからな。

また、どの関数がどの例外を投げる可能性があるのか
わからせる為に、列記しなきゃならないってとこ
はっきり言ってダルいっしょ。IDEのサポート無しじゃ書いてられないよ。
現にSTLportとか守ってないしな、駄目じゃん標準ライブラリが守らないんじゃw
まー、こーいうとこはまだ改善の余地ありとか思う。
0263デフォルトの名無しさんNGNG
そういうときこそ

public void finc1() {
 try{

 } catch (Exception1 e){ ... }
  catch (Exception e){ ... }
}
とメソッド内に納めると思うのだが。
0264デフォルトの名無しさんNGNG
あとは、例外クラスを自作するとかな。
Exceptionクラスを継承してな。

public class Exception1 extends Exception {
 public Exception(){
  super("original exception message.");
 }
 public Exception1(String message){
  super(message);
 }
}
みたいにな。
0265デフォルトの名無しさんNGNG
キャッチした例外をため込みテクニックもある。

import java.util.ArrayList;

//略

 private ArrayList exceptionArray;
public void finc1() {
 try{

 } catch (Exception1 e){
  exceptionArray.add(e);
  e.printStackTrace();
 }
  catch (Exception e){
  exceptionArray.add(e);
  e.printStackTrace();
 }
}
こうやって例外をキャッチするたびにArrayListに例外オブジェクトを蓄積してゆく。
そうすると例外情報が上書きによって隠蔽されることもなく、
欲しい例外情報を確実にはき出してくれる。
0266デフォルトの名無しさんNGNG
しかし例外というのも考えると難しいよ。
例えばゼロ除算だが、これの例外処理って必要だろうか?
例外として起こりうる可能性がある以上設けるべきだろうか、
しかし、そもそもまともなコードを書いていればゼロ除算など
ありえない訳で。
ありえないならそもそも例外なんて考えなくていいんじゃないか
みたいな。

また例外というか、コンピュータにおけるエラーって極端に言えば
1、ハードの障害によるもの
2、オペレーターの入力ミスによるもの
この2点しかありえない訳じゃん。(バグを除く)
だったら、この2点だけ対象とした特例的処置を設ければ
それ以外の部分ででエラーというものを意識する必要なんて
別段ない気がするんだよね。
0267デフォルトの名無しさんNGNG
>>266
ゼロ除算はJavaなら無問題だが。
では新たにそういうものを実装するにはどうすればいいか?
RuntimeExceptionクラスを継承するが
それをなにかしらクラスに組み込まないといけない。
0268デフォルトの名無しさんNGNG
データのvalidationをする部分と
データの実処理をする部分を
分けて作ればいいじゃん。

だいたい二度手間になるけど。
0269デフォルトの名無しさんNGNG
>>266
その二点だけじゃないんだよ。
リリースされて顧客が実際に使ってみて
初めて解るような潜在的バグというものが隠れている。
顧客に気づかれる前にこちらで処理するにはテストケースを
作るのだが。例外があるなら例外を積極的に優先的に使った方がいい。

キャッチされるかも知れない例外はすべてとらえておくべき。


0270デフォルトの名無しさんNGNG
おまいら、例外投げまくるライブラリは作るの楽ですよ。(たぶん)
0271デフォルトの名無しさんNGNG
>>262
それ大雑把すぎじゃないの
>>258の例で言えば
try{ func1(); } catch(exeption1 &e) {};
try{ func2(); } catch(exeption2 &e) {};
try{ func3(); } catch(exeption3 &e) {};
try{ func4(); } catch(exeption4 &e) {};
と書けばいいだけで。

>>265
C#ではInnerExceptionって親例外を参照するプロパティがあるので
ArrayListに格納しなくても連鎖的に保持できるよ。
0272デフォルトの名無しさんNGNG
>241
亀レスだが嘘書くな。特許の三つの条件言ってみろよ
0273デフォルトの名無しさんNGNG
>>271
func1がexeption1「しか」throwしないなら、ね。
func1〜4それぞれがexeption1〜4の全てをthrowし得るならどうする?
0274デフォルトの名無しさんNGNG
>>266
Connection refused
0275デフォルトの名無しさんNGNG
>>271
C#ではJavaにあるthrows宣言が存在しない対策をどうとっているのか是非とも教えて遅れ。
0276デフォルトの名無しさんNGNG
>>275
throwsに対応する機能はないよ。ノーガード。
throwsネタは21世紀における新宗教論争だからここでは意見してあげないw

C#作者の考えはこんなかんじ
http://www.artima.com/intv/handcuffsP.html
0277デフォルトの名無しさんNGNG
>>266
> 例えばゼロ除算だが、これの例外処理って必要だろうか?
必要に決まってんじゃん。
たとえばその例外発生元がプラグインだった場合、
プラグインだけを切り離さなければならない。
全部落ちる必要はないし、その程度でメインのプログラムが落ちたらマヌケだろ。
プラグインじゃなくても、ゼロ除算により「その機能」が
使えないだけで他に影響ない部分もある。

他にも例外発生を分かりやすくするためにログに出力したり、メールで送信する場合も有る。
例外発生してそのまま処理を進ませられない場合でも、例外の処理をすることはある。

ただ、例外を処理するのはいいが、ログに出力しただけで、
例外が発生してない場合と同じ処理を続行するなんてコードを書かないこと。
たとえば>>234のEclipseの自動生成されたtry/catchブロックのようなもの。

例外の基本は上位の関数へ、そのまま/後処理をして/例外の種類を変えて throw。
スタックの最後の部分で例外処理。途中でもみ消したい場合のみ途中で処理。
0278デフォルトの名無しさんNGNG
>>277
>ただ、例外を処理するのはいいが、ログに出力しただけで、
>例外が発生してない場合と同じ処理を続行するなんてコードを書かないこと。
理由を聞きたい
0279デフォルトの名無しさんNGNG
>>277
まずゼロ除算というのはバグでしか発生しないよね。
そうするとつまり例外機構とは、バグが発生元なる例外も対象としていると考えて良いの?
自分としては、本来は含まれない、含まれないことが望ましいバグというものの為に
リソースを割り振るというのが、なんか引っかかるんだよね。
リリースビルドに、assertマクロをそのまんま残している感じで釈然としない
0280デフォルトの名無しさんNGNG
例外派は、除算する前にゼロチェックしないの?
0281デフォルトの名無しさんNGNG
0割するような入力してきたやつに対して、
関数側はどう返事したらいいんだ?
例外か返り値で返すしかないだろ。

返り値をエラー識別子なんぞに使いたくないから、
例外を返すんだ。わかる?

なんでゼロ割の話を特化させてるんだ?
ゼロ割を回避できるロジックが別にあるなら回避して、
無いなら例外だすだろ。普通は。
0282デフォルトの名無しさんNGNG
除算する前にゼロチェックって…

もしかして<fenv.h>すら知らない人?
C++の例外うんぬん以前に、レベル低すぎて話にならない。
http://www.opengroup.org/onlinepubs/009695399/basedefs/fenv.h.html

まあ除算する前にゼロチェックが有効な局面もあるけどね。
と馬鹿な反応をされないように書いておくよ。(これが例外処理)
0283デフォルトの名無しさんNGNG
>>276
C#はバグを減らすことよりも利便性を重視したからthrowsをはずしたんだと思っている。
0284デフォルトの名無しさんNGNG
>>283
リンク先読んだか?そんなこと言ってないよ。
0285デフォルトの名無しさんNGNG
彼が本当のことを言うと思うかい。
彼が本当のことを言わないのはほとんどが
お金のためなんだよ
0286ぽろじょあ ◆niBmDfC40k NGNG
( .3.) ボボボーボ・ボクは例外処理が嫌いなんだなNA
0287デフォルトの名無しさんNGNG
( .3.) ボボボーボ・ボクは例外処理が嫌いなんだなNaN
0288ぽろじょあ ◆niBmDfC40k NGNG
( .3.) ボボボーボ・ボクは2ちゃんねるの人気者だYO
       ぽろじょあ#ぽろっぽ
0289デフォルトの名無しさんNGNG
ほら、>>282 が空気読まないで書くから、変なのが来ちゃったじゃないか。
0290286NGNG
別のスレに居るのを真似して>>286書いたけど、
>>287と>>288は俺じゃないよ
0291NaN(>>282=>>287)NGNG
すまんな。
0292デフォルトの名無しさんNGNG
     もそもそ
        ,、ッ.ィ,  
      ,:'゙    '; 
    (( ミ,;:.   ,ッ )))
       ゙"'''''"゙
   もふっ
       ハ,_,ハ
      ,:' ´∀` ';
      ミ,;:.   ,ッ  ノノ
       ゙"'''''"゙
   ポィン 
       ハ,_,ハ  ポィン
      ,: ´∀` ';
      ミ,;:.   ,ッ
       ゙"'''''"゙ 
      ヽ  ili / 
     -      -

           スタッ
       ハ,_,ハ,
      n' ´∀`,n,
      ミ,;:.   ,ッ
       `'u゛-u'

            ズビシッ
       ハ,_,ハ
      ,:' ´∀`';9m <age!
      ミ,;.っ ,,ッ
      ι''"゙''u
0293ぽろじょあ ◆niBmDfC40k NGNG
( .3.) ボボボーボ・ボクは例外処理が嫌いなんだなNaN
0294ぽろじょあ ◆niBmDfC40k NGNG
( .3.) ボボボボーボ・ボクは例外処理が嫌いなんだなNaN
0295デフォルトの名無しさんNGNG
いやつまんねぇから
0296デフォルトの名無しさんNGNG
こいつを使えば例外処理もかなり楽になるでえ。
いちいちVectorに例外をため込む必要がなくなるで。

org.apache.commons.lang.exception.NestableException
http://www.jajakarta.org/commons/lang-2.0/ja/withoutPrimary/org/apache/commons/lang/exception/NestableException.html

org.apache.commons.lang.exception.NestableRuntimeException
http://www.jajakarta.org/commons/lang-2.0/ja/withoutPrimary/org/apache/commons/lang/exception/NestableRuntimeException.html
0297デフォルトの名無しさんNGNG
例外処理が嫌いな皆さんへ。

C++スレで536が叩かれてます。助けに行ってあげてください。
http://pc5.2ch.net/test/read.cgi/tech/1090180012/536-
0298デフォルトの名無しさんNGNG
>>297
期待通りの動きだ。
0299ぽろじょあ ◆niBmDfC40k NGNG
( .3.) ボボボーボ・ボクは例外処理が嫌いなんだなNaN
0300デフォルトの名無しさんNGNG
C++では例外処理なんて不要。男は黙って戻り値確認
0301デフォルトの名無しさんNGNG
C++では戻り値確認なんて不要。男は黙って例外処理。
0302デフォルトの名無しさんNGNG
C++なんて不要。男は黙ってろ
0303デフォルトの名無しさんNGNG
>>297
>>563と>>536とを間違えているだろ?
間違いを見つけるのに苦労したぞ。
まったく、最近こうレス番号を間違える奴が多すぎてウザイ
0304デフォルトの名無しさんNGNG
亀レスしときながら最近とか言うな
0305デフォルトの名無しさんNGNG
昔やったプロジェクトでさ、スレッド起動するクラスがあって、
そっから例外が飛んでくるとクラッシュしたりして大変だったね。
最初何が原因かわからなくてさ。
おかげで障害票てんこ盛り。
スレッド頭でキャッチしとけってーの。
スレッド越しの例外投げって危険極まりないね。
0306デフォルトの名無しさんNGNG
調べたら某ミドルウェアのライブラリが例外投げてんだよね。
勝手に起動したスレッド上で。
全然異常系テストしてねーなってことが判った。
結局そのライブラリは欠陥持ちだってことで、どうしようもないから
ミドルウェアのソース貰って修正したさ。
アホらし。
0307デフォルトの名無しさんNGNG
それは例外には責任無いだろw
0308デフォルトの名無しさんNGNG
>>307
俺が言いたいのは
例外とスレッドは相性悪いってことだよ。
C++は言語仕様で保障されてないからそれ以後怖くてな、
ミドルウェアの解析までやらされたんだぜ?
例外の仕様がこんなんじゃやってられねーよ。
クソコード書いたミドルウェアのアホ(逃げた)が一番悪いんだが、
不慣れで例外使われるより値返された方がマシだろ。
0309デフォルトの名無しさんNGNG
例外を投げるのはいいさ。
だけどな、任意の箇所で捕捉できなきゃただの爆弾だよ。
スレッドまたいだだけでクラッシュするのは頭悪いとしか言い様がない。
今回みたいな欠陥ライブラリは、外からじゃどうしようもないだろ。
ソースが参照できたからよかったものの、
無かったらプロジェクト消滅してたぜ?
0310デフォルトの名無しさんNGNG
例外を処理できる位置で捕らえないで、文句言ってるってことですか?
返された値をチェックしないでスレッドまたぐのとどう違うんですか?
0311デフォルトの名無しさんNGNG
↑おまえ、ミドルウェアのアホ並の思考回路だな。
0312デフォルトの名無しさんNGNG
例外に責任無いじゃん。
0313デフォルトの名無しさんNGNG
無いよね?
0314デフォルトの名無しさんNGNG
例外処理大好きな俺は orz
0315デフォルトの名無しさんNGNG
俺なんか一日に3回は例外投げてるけどね。
0316デフォルトの名無しさんNGNG
>>309
あのライブラリね。
俺もはまったことあるよ。
try・・・catchって書けば普通に動くようになるよ。
0317デフォルトの名無しさんNGNG
ここのが相応しくないか?

バグ対策とバカ対策
http://pc5.2ch.net/test/read.cgi/tech/1067106300/
0318デフォルトの名無しさんNGNG
例外はちゃんとキャッチしろよ
0319デフォルトの名無しさんNGNG
↓例外
0320デフォルトの名無しさんNGNG
│    _、 _
│  ヽ( д` ; )ノ
│ へノ   /
└→ ω ノ
       >
0321デフォルトの名無しさんNGNG
|   ∧_∧
|  ( *´Д`)
|  人 ヽノ、
└―(  ヽ_つ,,,つ
プスッ )  ))
   (__))
0322デフォルトの名無しさんNGNG
>>308>>309
例外だからこそ、すぐに問題が発見されたのであって、
エラー原因を返り値で渡し損なっている、
って問題ならもっと発見しにくかったはず。

>>305>>306までの愚痴はまあ分かる。
0323デフォルトの名無しさんNGNG
ただのよくあるタイプのバグの一つだろ
0324デフォルトの名無しさんNGNG
>>305
ちゃんとロギングしろよ。
今ならアスペクト指向プログラミングによって
さらにロギングが楽になったぞ。
0325デフォルトの名無しさんNGNG
>>324
得体の知れない処理系なんか仕事で使えるかっての
0326デフォルトの名無しさんNGNG
>>325
処理系というほどのものじゃないだろ。
JBoss
Spring
Seasar
など、盛りだくさん。
勝手に選べ。
いまならDIというオマケつき。
0327デフォルトの名無しさんNGNG
>>326
世の中には「自社開発でない=得体の知れない、使えない」っつー思考する所がゴマンとあるのさ・・・
0328デフォルトの名無しさんNGNG
きっと規模が大きいだろうに、AOPの実装もできないのか?
0329デフォルトの名無しさんNGNG
ほほほほほほほほほほ保守
0330デフォルトの名無しさんNGNG
「ボボ」は一部の地域では放送禁止。
0331デフォルトの名無しさんNGNG
>>330
どこ?
0332デフォルトの名無しさんNGNG
>>331
気になるんなら、検索するか
日本全国の女性と付き合って「ボボ!」って
叫んでみて、ひっぱたかれたらそこだッ!
0333デフォルトの名無しさんNGNG
>>96
newの再配置構文を知らないみたいね。realloc的なものが
ないわけないでしょ。
0334デフォルトの名無しさんNGNG
一年前のレスに向かって語りかける気分はどうだい?
0335デフォルトの名無しさんNGNG
placement newはreallocとはぜんぜん違う気が
0336デフォルトの名無しさんNGNG
>>324
アスペクト嗜好の資料を読んで
ログに使えると思った奴は素人
■ このスレッドは過去ログ倉庫に格納されています