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

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

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

そもそも例外処理って大域ジャンプだろ、
そんなもの怖くて使えねーよ
0175デフォルトの名無しさんNGNG
>>172
そんな言葉を知らないことを恥だと考えることの方が恥ずかしいんだけど。
0176デフォルトの名無しさんNGNG
>>174
何がしたいのか知らんがこれで十分だろ
main(){main();}
0177デフォルトの名無しさんNGNG
main() は、プログラムから呼び出してはならない。
main() のリンケージは、実装依存である。
main() のアドレスを使うことはできず、main() を inline や static と宣言してもならない。

■これは、プログラムとその環境の間のインターフェースの実装者に完全な裁量権を保証するためである。
■ゆえに、main() を関数として実装しないような実装を想像することさえできるであろう。

そんな実装が実在するかどうかは知らんけどね。
0178デフォルトの名無しさんNGNG
一般的には、スタートアップが通常のmain()関数を呼び出す形式だからな。
0179デフォルトの名無しさんNGNG
extern "C" char main[] = {0xc9};
0180デフォルトの名無しさんNGNG
>>179
懐かしいな
0181デフォルトの名無しさんNGNG
ハダカの対象
0182デフォルトの名無しさんNGNG
>>181
死んだ。
0183デフォルトの名無しさんNGNG
try{
throw(10);
}catch(int i){
throw(10);
}
0184デフォルトの名無しさんNGNG
俺は例外が出ても例外由来とエラーの内容をコメントさせるだけで
対処しないヘタレ。アサートダイアログより親切か?程度の
Windowプログラマの戯言ですた。やってることはデバッグの
延長線上でしかなかったりする。
OSとかサーバとかなら何とかせにゃならんかもって気がするが。
0185デフォルトの名無しさんNGNG
500
0186デフォルトの名無しさんNGNG
>>153
それをいうなら
エラー出力をリダイレクトできないMS-DOSひいては95系列の
Windowsの設計ミス。

Javaはエラー出力をファイル等にリダイレクトする必要性から
しかたなくそういう仕様になった。(Windows版だけだったかもしれん)
0187デフォルトの名無しさんNGNG
鼻毛
0188デフォルトの名無しさんNGNG
>>186
WindowsのせいでJavaはかような糞言語になったという主張だね?
0189デフォルトの名無しさんNGNG
裸のジェネラル
0190デフォルトの名無しさんNGNG
ボボボーボ・ボクは例外処理が嫌いなんだな
0191デフォルトの名無しさんNGNG
catchし忘れの例外がthrowされてたら、
必ず警告なりエラーなり出すようにすれば?
コンパイラがさ。
0192デフォルトの名無しさんNGNG
↑あ、ごめん対策済みでしたか。失礼しました。
0193デフォルトの名無しさんNGNG
ボボボーボ・ボーボボクは例外処理が き 嫌い いいいいいいいいいいいいいい いいいいいいいいいいいいいいいいいいな なななななんだな なな
0194デフォルトの名無しさんNGNG
野に咲く〜 花のよ〜うに〜
0195デフォルトの名無しさんNGNG
鼻毛真拳
0196デフォルトの名無しさんNGNG
ボゲー!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0197デフォルトの名無しさんNGNG
>>36
実際、何を勘違いしているのか、例外を正常な動作の分岐用フラグのつもりで
使うというやつがいて困ったことがあるなぁ

「例外」とかかっこつけてオブラートに包んだ表現しないで
素直に「エラー」と呼ぶようにすれば多少意識が変わるのではないかと思う。

DOSのBATだとERRORLEVELで分岐するのが通常だがな。
0198デフォルトの名無しさんNGNG
ところで、JavaでもGenericsを使い出すと投げられる例外を
事前に決めておくのが辛くなってくると思うんだが、
その辺の対策は無し?
0199デフォルトの名無しさんNGNG
〜 ←鼻毛
0200デフォルトの名無しさんNGNG
〜 ←尻毛
0201おそれすNGNG
>>198
JavaのGenericsでは、throwする例外の型が変わるはずないと思うが。
0202デフォルトの名無しさんNGNG
>>201

public class HogeException<T> extends Exception {}
があったときに
try {
} catch (HogeException<Foo> e) {
}
とかできないって話だろ?
0203デフォルトの名無しさんNGNG
ボボボーボ・ボク
0204デフォルトの名無しさんNGNG
>>202
それをやるなら、独自のExceptionを作れと。
JavaのGenericsはコンパイル時型チェックの仕組みだしな。
0205デフォルトの名無しさんNGNG
>>1
使えない奴はあんたみたいに大抵例外放置してるよ。
RuntimeExceptionは完全無視、
後は大体catch( Exception e ) {}で放置。
エラー起きて発生箇所特定するのにハァハァ必死な顔してるよ。
0206デフォルトの名無しさんNGNG
>>197
CLUはend of fileを例外で処理する仕様のライブラリでした。
End of listはどうだったかなあ?
0207デフォルトの名無しさんNGNG
スレタイのボーボボとは?
0208デフォルトの名無しさんNGNG
>>207
スレタイは、ボーボボの部分が入れ替わってると思うが。
0209デフォルトの名無しさんNGNG
>>207-208
正直、意味が分からん。
0210デフォルトの名無しさんNGNG
>>209
そのくらいぐぐれよ( ̄ー ̄)
ttp://www.tv-asahi.co.jp/bo-bobo/
0211デフォルトの名無しさんNGNG
>>210
正直、意味が分からん。
0212デフォルトの名無しさんNGNG
ヽ( ・∀・)ノ ウンコー
0213デフォルトの名無しさんNGNG
なんでも首突っ込むじじい
0214デフォルトの名無しさんNGNG
>>211
意味のわからなさだけがウリのマンガだからな。
0215デフォルトの名無しさんNGNG
例外処理は、それなりの分散処理や大規模なプロジェクトにこそ必要。
なのにC++の場合は、コンパイラの例外処理に対する仕様が統一されてないのはなんともな。

bccでは可能なthrowの再投入がgccでは出来なかったり、
例外呼び出したことが原因で止まったりとか頭痛い。
0216デフォルトの名無しさんNGNG
>>215
お前がコンパイラとデバッガの使い方を知らないだけ。
0217デフォルトの名無しさんNGNG
>>216
それを言われると辛いな。

んで、調べたんだけど分からないんですが、
gcc(g++)で、例外の再投入時のコアダンプ出しての終了を止めさせる方法と。
VC付属のコンパイラで、関数の例外指定可能にする方法教えてください。
後者の方は調べた先では無理みたいな英文が載ってたんですが、
隠しオプションか何かあるんですか?
0218217NGNG
>関数の例外指定
じゃなくて、関数の例外型指定でした。
0219あいタン ◆3QC.t4i5w6 NGNG
ぬるぽだね!

( ノ ̄∇ ̄)ノ みんなーーーーーーー、あいでーーす!!( ̄ー ̄)ニヤリッ
またーーーーり
0220デフォルトの名無しさんNGNG
>>217
> gcc(g++)で、例外の再投入時のコアダンプ出しての終了を止めさせる方法と。

例外を再投入してコアダンプ出して終了するソースをみせてくれませんか?
0221デフォルトの名無しさんNGNG
#include <iostream.h>

main( )
{
try
{
try
{
throw "トライ";
}
catch ( ... )
{
cout << "全ての例外を捕まえた" << endl;
throw;
}
}
catch ( char *s )
{
cout << "メッセージ: " << s << endl;
}
}

これなんですけど、bcc32では問題ないんですが、
g++だと再投入時に停止するんですよね。
0222デフォルトの名無しさんNGNG
>>221
"トライ"は char const* だから、 catch( char* ) にはマッチしない。
マッチするハンドラが見つからないからabort()逝きで正しい。
キャッチしてしまうbccがクソ。
0223デフォルトの名無しさんNGNG
文字列リテラルは互換性のためchar*だけど?
0224デフォルトの名無しさんNGNG
きゃは、bccの糞さ加減が露呈(プゲラ
0225デフォルトの名無しさんNGNG
>>222
なるほど、そういうことでしたか。
成功しました、どうもありがとうございます。

しかし、これbcc厳しいですね。
const char *もchar *両方マッチングしてしまうんですね。
0226デフォルトの名無しさんNGNG
>>223
throwに文字列リテラルを書いた場合はその変換は起こらないことが明記されているようだ。
FDISの 15.1 -3- に記述がある。
0227デフォルトの名無しさんNGNG
>>186
よくわからないけど、stderrの話?
0228デフォルトの名無しさんNGNG
鼻毛真拳の話
0229デフォルトの名無しさんNGNG
鼻毛真拳の話
0230デフォルトの名無しさんNGNG
ところてんの話。
0231デフォルトの名無しさんNGNG
operation;
if (failed) {
 rollback;
}

よりも

operation
if (failed) {
 throw;
}
....
catch() {
 rollback;
}

の方がどう考えても見苦しいんですが、
フレームワークの方で例外を投げてくれない場合も自分で例外投げるのって普通なんですか?
0232デフォルトの名無しさんNGNG
...
の部分で失敗する要因がないなら自分で投げるのはアホだな。
あるならありかもね。
0233デフォルトの名無しさんNGNG
>>231
C用のフレームワークをラップするときは普通でしょ。
返り値エラーから例外への変換ね。
0234デフォルトの名無しさんNGNG
http://www.atmarkit.co.jp/fjava/javatips/005eclipse002.html
 @IT > Java Solution > Java TIPS > すべての例外クラスを捕捉する
 Eclipse活用編
Eclipseですべての例外クラスを捕捉する

こういう機能があると例外を積極的に試用することも惜しまなくなる。
0235デフォルトの名無しさんNGNG
>>234
printStackTraceだけかよ。
まったく、いやな例外処理だな。
それじゃ例外おきてもログ吐くだけでそのまま処理がすすむつーの。
無い方がマシ。
0236デフォルトの名無しさんNGNG
IDEでTODOを自動生成したりそれを一覧表示する機能はMSの特許に抵触するな。
Eclipseからは送球に削除した方がいい。
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
■ このスレッドは過去ログ倉庫に格納されています