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

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

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

そもそも例外処理って大域ジャンプだろ、
そんなもの怖くて使えねーよ
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
アスペクト嗜好の資料を読んで
ログに使えると思った奴は素人
0337デフォルトの名無しさんNGNG
}catch(...){

これでcatch all
0338デフォルトの名無しさんNGNG
}
catch(Throwable e){
//>>1-337

}
0339デフォルトの名無しさんNGNG
頼むからさぁ、Effective JavaやMore Effective C++の例外処理の項とか
Exceptional C++とかぐらい読んでくれないかなあ。
0340デフォルトの名無しさんNGNG
強制させるならその本買ってきてよ
0341デフォルトの名無しさんNGNG
Effective VB.NETがでたら読みます
0342デフォルトの名無しさんNGNG
批判するならするだけの前提知識を持ってからにしろよと言ってるんだ。
0343デフォルトの名無しさんNGNG
むしろこれらはC++やJava使うなら最低限の必読書だと思うが
0344デフォルトの名無しさんNGNG
.NETの例外関係の設計はどうなの?

longhornは例外処理を持つ言語でAPIを全て設計し直しだから、
ちょっと期待しているんだけど。

ただ、MSは基本部分のエンジニアは優秀な人をお金出して呼んでいるけど、
周辺や実装部隊はイマイチだから、とんでも例外設計の可能性もあるなあ。
0345デフォルトの名無しさんNGNG
↓待ってましたとばかりにthrows厨登場
0346344NGNG
↑おい、出鼻くじくなよ(w
0347デフォルトの名無しさんNGNG
>>344
例外キャッチしなくてもコンパイルとおるんじゃないか?
あんまいい作りとは思えんが
0348デフォルトの名無しさんNGNG
そりゃ言語の仕様でしょ。
APIの設計はどうなんだろうねえ。
MSDNをちらっと見てみたけど、概説はまだないね。
0349デフォルトの名無しさんNGNG
>>347
ttp://msdn.microsoft.com/vcsharp/team/language/ask/exceptionspecs/default.aspx
0350デフォルトの名無しさん05/02/08 17:38:03
VB6で、例外が起きた場所をキャッチして
画面ポップアップMSGにだすことは可能ですか
0351デフォルトの名無しさん05/02/08 18:58:54
assertと例外の使い分けってどうしてる?
0352デフォルトの名無しさん05/02/08 19:24:35
ライブラリの仕様としてのチェック(引数の正当性やメソッドがコール可能かどうかなど)は例外
デバッグ中のチェックコードはassert
0353デフォルトの名無しさん05/02/08 23:50:24
例外の使い方わからない(´Д`)


bool OresamaFunc()
{
  try{
    if(hogehoge){
      return false; // Error
    }
    // いろんな処理・・・
  }catch(...){
    //なんか例外出たのでエラーとする
    return false
  }

  return true;
}

これじゃだめ?(´Д`)
0354デフォルトの名無しさん05/02/09 00:27:43
>>353
↓こっちのが幸せな気がしないかい?

void OresamaFunc()
{
  if(hogehoge){
    throw OresamaError;
  }
  // いろんな処理・・・
}
0355デフォルトの名無しさん2005/06/19(日) 23:21:33
つーかよ、353は例外出た場合、
bool で true false 以外に unknown として例外を返す必要があるとは思わないのか?

OresamaFuncは正常に処理できた実行結果としてtrue falseを返す訳だから
そもそも処理自体が行えなかった場合にはunknown(処理できなかったよ)として
どういう理由で処理できなかったかの例外を関数の呼び出し元に飛ばすべきだろ。

例外発生時に「あぁ、このエラーは漏れの処理ではありうる事なんだYo」と、
呼び出し元が考えるか、「何じゃこりゃ?」と考えるかは
OresamaFancが判断すべき状況じゃないからとりあえず上に例外を投げるんだ。

そしたら、OresamaFancを呼び出した奴が例外を受け取ったときに
適切に判断してくれる(はず)ってのが例外のそもそもの考え方じゃねぇのか?
0356デフォルトの名無しさん2005/06/19(日) 23:29:17
まぁ、354が考えたように
処理が行えたらtrue で行えなかったら false っていうレベルの関数なら
無理に例外投げないで353の実装でもいいと思うけどな。
呼び出し元で

if (OresamaFunc()){
OredayoOre();
}else{
Shoboon();
}

っていう書き方できるし、そっちのほうが漏れ的には好みかな。
例外機構を使うと

try{
OresamaFunc();
OredayoOre();
}catch(OresamaError e){
Shoboonn();
}

見たいな感じで、if文を目の敵にしたのはいいが、
本質的に何も変わらないコードっつーのもなんだかなぁ。
0357デフォルトの名無しさん2005/06/21(火) 02:12:01
A「例外は工数短縮に有効だよなあ」
B「ミスも少ないですよね」
C「例外はタイピング早いですよね」
A「例外はタイピングしないよ。なあ?」
B「しませんよ、例外は」
0358デフォルトの名無しさん2005/06/26(日) 00:32:33
>>355
話になんねぇよ。Unknownって何だよ。意味わかんねぇ。
SQLやりすぎて頭おかしくなった糞コボラ?
BOOLは2値を返す。それが全て。
0359デフォルトの名無しさん2005/06/26(日) 00:39:31
>>358
失敗も含めると、結果が2値に収まらないのが問題なんだよ。
0360デフォルトの名無しさん2005/06/26(日) 00:43:06
>>1..359

C言語なみのバカだなw
0361デフォルトの名無しさん2005/06/26(日) 00:44:32
なぁなぁ、>>357の言ってる意味がさっぱりわからないんだけどどういうこと?
0362デフォルトの名無しさん2005/06/26(日) 01:00:10
明日10時に起きてサンデープロジェクト見ればわかる
■ このスレッドは過去ログ倉庫に格納されています