東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

わんくま東京勉強会#56 懇親会ふぉろー

懇親会の席上でおもろいネタで盛り上がってました:

 「コンストラクタが例外を投げるのはアリか?」

僕は「ないわー」派についていたのですが、帰りの電車に揺られて酔いを醒ましてるうちに「アリかも」と思い始めてました。# かなはるちゃんいぢめてごめんよー

そもそも例外処理てぇのは
「エラーを検出できるが対処できない」呼ばれ側 と
「エラーに対処できるが検出できない」呼び側
との間でエラーをやり取りするためのからくり、なハズです。

するってーと例外ちゅーのは
"あり得ないこと"が起こった事を知らせるっちゅーより、
"対処不能なこと"が起こった事を知らせるもんだろ、と。

であるなら、コンストラクタ内で"対処不能なこと"が起こったのならその旨を呼び側に伝えるべく例外投げるのはアリかと思うですね。

※ かたやデストラクタで例外投げるのはどんなもんよ。
デストラクタは往々にして暗黙のうちに呼ばれるし、.NETだといつ呼ばれるかはおろか確実に呼ばれるかすら定かじゃない。んなもんcatchできひんやん。

 

投稿日時 : 2011年2月20日 0:32

コメントを追加

# コンストラクタで例外はありか? 2011/02/20 1:24 とっちゃん's Blog

コンストラクタで例外はありか?

# 
Twitter Trackbacks for

???????????????????????????#56 ?????????????????????
[wankuma.com]
on Topsy.com
2011/02/20 3:54 Pingback/TrackBack


Twitter Trackbacks for

???????????????????????????#56 ?????????????????????
[wankuma.com]
on Topsy.com

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/20 12:39 デフォルトの名無しさん

いまだにこんな迷信が記事(ネタ)になるなんて驚きです。下記リンク先を
参照のうえ、必要に応じて訂正・追記などおねがいします。
http://www2.research.att.com/~bs/bs_faq2.html#ctor-exceptions
http://www.parashift.com/c++-faq/exceptions.html#faq-17.8
http://www.kijineko.co.jp/tech/superstitions/dont-throw-exception-from-constructor.html

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/20 13:19 επιστημη

よーく考えて「例外投げるべきでない」とすることのどこが迷信なんだ?
それが間違いだとしても迷信じゃないね。

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/20 14:07 デフォルトの名無しさん

すいません。「迷信」であるかどうかはあんまり重要だとは思っていません
でした。間違っているのならその点は無視してください。すいません。

コンストラクタの失敗は例外で通知するのが FAQ の答えであり標準 C++ の
想定している方法なのだということを、この記事を読んだ人が認識できるように
なっていればそれでいいです。

具体的には、「よーく考えて「例外投げるべきでない」とする」のであれば
それがローカルルールであることを認識し「よーく考えて」の部分と併せて
文書化されるべきだ、逆にコンストラクタから例外を投げるのにいちいち根拠を
述べる必要があるようでは面倒だ、と思うのです。

# コンストラクタで例外はアリか? ~私はアリ派 2011/02/20 14:31 Chiharu

私はアリ派です。
例外安全の観点から、C++ 的には dtor, swap, exception の例外送出は NG と思いますが、それ以外なら実装者依存かなーと思ってます。
ただこの議論。言語仕様上、例外安全が達成できないのか、運用上、例外安全を達成しにくいのか、分けて考えたほうが良いように思います。多分、前者はクリアしていて、後者の議論なのだと思っていますが。

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/20 16:34 επιστημη

んむ。"対処不能なこと"を例外で投げるんだから、
"できるだけのこと(後始末)"をした上で投げんならんでしょう。
で、その"できるだけのこと"を確実にやんないとアナあけちゃうよねー、と。

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/21 12:19 デフォルトの名無しさん

そのような運用上の問題はコンストラクタに限ったものではないはずです。
むしろ状態の残るメンバ関数内での例外発生に比べれば、状態の残らない
コンストラクタでの例外発生のほうが問題が起こる可能性は少ないとも言え
ます。

通常のメンバ関数やフリー関数が例外を投げることも同様に疑問視されている
のでしょうか?それとも、それらの関数に比べてコンストラクタで例外を投げる
ことに何か追加の危険性があるということでしょうか?

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/22 5:58 επιστημη

function-try-blockがサポートされていない処理系だと基底コンストラクタとメンバ初期化子で起こった例外をcatchできないもんだからエラーの対処が中途半端なもんで、is_ok()みたいな補助的な手段を併用せざるを得ず、そんなことならos_ok()だけでいーじゃん、てなことになっちゃって"た"のが「コンストラクタで例外はナシ」の一因かと思うんですよねー。

class Derived : public Base {
 Other menber;
public:
 Derived() try : Base(0),member(1) {
  ごにょごにょ
 } catch (
  つい最近までこんなことできなかったの
 }
 ...
}

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/22 7:31 Chiharu

やっぱりその辺の理由だったんですよね。きっと。is_ok() はコンストラクタの成否をインスタンス生成後に判別する運用ですよね。
Test test; // エラー時、例外送出せず
if (!test.is_ok()) {
// ここでコンストラクタでのエラーに対処
}
以前、職場で運用したことありますが、呼び出し忘れが多発した経験があります。呼び出さなくても正常系のフローが完走してしまうので、気を抜くとチェックし忘れるんですよね…。
ところで os_ok() とはどういった対応なのでしょうか?

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/22 12:08 デフォルトの名無しさん

function-try-block を使った catch 節の中では基底クラスやメンバ変数は
未初期化であるかすでにデストラクタが走った後なので安全にアクセスする
ことはできず、結局のところ例外型の変換ぐらいしかできることはありません。
15.3 Handling an exception p10
> Referring to any non-static member or base class of an object in the
> handler for a function-try-block of a constructor or destructor for
> that object results in undefined behavior.
http://www.gotw.ca/gotw/066.htm
> A constructor cannot possibly recover and do something sensible after
> one of its base or member subobjects' constructors throws. ...
(このリンク先が10年前の記事です・・・)

function-try-block のサポートさえあれば例外への対処ができていたという
話は成り立たないと思います。 function-try-block のサポートが無い環境でも
有る環境でも、コンストラクタの失敗に対する最適解はスマートポインタなどに
よる RAII の徹底です。

# re: わんくま東京勉強会#56 懇親会ふぉろー 2011/02/22 19:08 επιστημη

> os_ok()

ぁぅぁぅtypoです。そこはis_ok()でis_okです。

> function-try-block を使った catch 節の中では...例外型の変換ぐらいしかでき
ることはありません。
> function-try-block のサポートさえあれば例外への対処ができていたという
話は成り立たないと思います。

ごもっとも。コメントで長話もァレなのでエントリ立てます。

# eZIQBVGAqMFfgJy 2021/07/03 1:38 http://www.yalewiki.org/index.php?title=User:Qeana

Major thanks for the blog article.Thanks Again. Keep writing.

# IhPFmncvMeHFHPYB 2021/07/03 3:07 https://amzn.to/365xyVY

This website was how do you say it? Relevant!! Finally I ave found something which helped me. Appreciate it!

# rdcjSvOaaOH 2021/07/03 4:37 https://www.blogger.com/profile/060647091882378654

This is one awesome post.Really looking forward to read more. Much obliged.

# re: ?????????#56 ??????? 2021/07/06 15:29 hydroxychloroquine sulfate tablets

chloroquine moa https://chloroquineorigin.com/# hydroxychloroquine 400 mg

# re: ?????????#56 ??????? 2021/07/12 14:49 antimalarial drug hydroxychloroquine

chloroquine phosphate tablet https://chloroquineorigin.com/# how safe is hydroxychloroquine

# re: ?????????#56 ??????? 2021/07/23 18:03 hydroclorizine

chloroquine malaria https://chloroquineorigin.com/# how long has hydroxychloroquine been used

# NAENshyWvuChVTrOiZ 2022/04/19 13:53 johnanz

http://imrdsoacha.gov.co/silvitra-120mg-qrms

# where to buy chloroquine 2022/12/25 20:19 MorrisReaks

200mg hydroxychloroquine http://www.hydroxychloroquinex.com/

# ロレックス偽物時計 2023/03/25 1:30 izvikuqyzu@nifty.com

迅速なご対応で、質問他すべて素早かったです。ヴィトンのAランクの小物購入でしたが、状態は良くとても綺麗でした。梱包も丁寧でしたし、手書きメッセージも感じが良かったです。ありがとうございました。
ロレックス偽物時計 https://www.ginza24.com/product/detail/35.htm

# オデッセイ ブルガリ時計 ディアゴノ 2023/11/07 21:52 ovrszdhywfu@nifty.com

看板に偽りなし、本当に新品同様でした。配送も早かったです。また、手書きの一筆箋を同封いただき、心がこもった対応だと感じました。
☆新品同様!! 【送料無料】★ルイヴィトン★タイガ★ポルトバルール・カルトクレディ★ニつ折り長札入れ★M30392★
かなりじろじろ見まわしましたが、全く使用感が無く文字通り新品同様でした。何故こんな安く買えてしまったのでしょうか。ラッキーとしか言いようがありません。
オデッセイ ブルガリ時計 ディアゴノ https://www.bagtojapan.com/category/263/1-key=3.htm

タイトル
名前
URL
コメント