掲題の通りなんですが、
会社の後輩に説明をしていてVS2005のMSDNにはクラスのメンバー関数の説明に
その関数が投げる可能性がある例外が明記されていない事に気がつきました。
VC++6.0時代のMSDNには各メンバー変数の説明に以下のような表記があります。
int Add( ARG_TYPE newElement );
throw( CMemoryException );
私はこの記述を頼りに各メンバー関数がどんな例外を投げるのかを判断していました。
調べて見たところ、.NET 2003のMSDNでも既にこの表記が無いようです。
(.NET 2002に関しては環境が無いので確認できていません)
そこで皆さんに質問なんですが、VS2005のMSDNでクラスのメンバー関数が
どんな例外を投げるかをどのようのして調べているのでしょうか?
もし良い方法を御存知の方がいらっしゃいましたらぜひ教えてください。
こちらでもMSDNの記述を追いかけながら探してはいますが、
今のところ調べる方法が確認できていない状態です。
…僕も。 orz
どんな例外投げるかわからんとcatch節の書きようがないのにねぇ。
ドキュメントの解説読むのと、sscli追いかけるくらいでしょうか。
# 後者(前者も?)はあんまアテにはなりませんが ^^;
予め期待できる例外に対してはとりあえず
CExceptionでcatchしてGetRuntimeClass()->m_lpszClassNameとか。
未知の例外についてはドキュメントに頼るか
ソース読むくらいしかなさそうな気がします(汗)
ありゃりゃ、皆さんやっぱり困っているんですね。
今のところは古いMSDNも入れてあるんで参考にはなるんですが、
新人君なんかだと古いのが入っていないから確認のしようが無いんですよねぇ。
ドキュメントの解説に書いてあればまだ良いんですが、
例に挙げているケースだとそれすらないので。
どこまで深く追いかければわかるのやら。
ソースで追いかけるって言っても例外の種類を確認するためだけに
その都度、ソースを追いかけると言うのはいくらなんでも効率が・・・。
こりゃあ、MSに要望でも出さないと駄目なのかなぁ。
と言うわけで、引き続き有力な情報を募集いたします。
何か良い方法を御存知の方がいらっしゃいましたら
よろしくお願いします。
一つあったけど、個別には載ってないですね。
http://msdn2.microsoft.com/ja-jp/library/t078xe4f(VS.80).aspx
気になったのが、
> プログラムで C++ 例外処理機構を有効にするには、プロジェクトの
> [プロパティ ページ] ダイアログ ボックスの [C/C++] フォルダで、
> [コード生成] ページの [C++ の例外を有効にする] チェック ボックスを
> オンにします。または、/GX コンパイラ オプションを使います。
> 既定は /GX- (例外処理を無効にする) です。
と、
CFileの説明で、
VC6.0
デフォルトのコンストラクタはファイルを開かずに、
m_hFile を CFile::hFileNull に設定します。このコンストラクタは、
例外をスローしないので、TRY/CATCH ロジックを使うことには意味がありません。
Open メンバ関数を使って、直接例外状態を調べてください。
例外処理の方法については、『Visual C++ プログラマーズ ガイド』の「例外処理のト
ピック (MFC)」を参照してください。
-------- 中略 --------------
> 2 つの引数を持つコンストラクタは、CFile オブジェクトを構築し、
> 指定されたパスのオペレーティング システム ファイルを開きます。
> このコンストラクタは、最初のコンストラクタの機能と Open メンバ関数を組み合
> わせたものです。
※
> このコンストラクタでは、ファイルのオープンでエラーが発生すると、
> 例外がスローされます。
> 一般に、この例外は回復できないエラーで、ユーザーに注意を促さなければならない
> ことを意味します。
例にTRY/CATCH ロジックがある。
.NET 2003
> 2 つの関数を使うと、ファイルを開くときに、失敗する可能性があっても
> 安全に 操作できます。
> エラーが発生した場合、CFile コンストラクタは例外をスローしますが、
> Open は FALSE を返します。
> しかし、Open は、エラーを説明するために CFileException オブジェクト
> を初期化できます。パラメータ pError を指定しなかった場合、
> またはパラメータ pError に NULL を渡した場合は、Open は FALSE を返し、
> CFileException はスローしません。既存の CFileException へのポインタを渡すと、
> エラーが発生した場合、Open 関数はエラーを説明する情報を補います。
※
> いずれにしても、Open が例外をスローすることはありません。
例にTRY/CATCH ロジックがない。
エラーメッセージの取得のみ
です。
デフォルトで例外処理をおこなっているのかな?
> このコンストラクタでは、ファイルのオープンでエラーが発生すると、
> 例外がスローされます。
> エラーが発生した場合、CFile コンストラクタは例外をスローしますが、
VC6でもVC7.1でも、
CFileのコンストラクタは例外を投げるはずで、
Openはエラーを返したはずですが。
表現の違いだけでは?
すみません、同じこと書いてありました。
>このコンストラクタは、例外をスローしないので、TRY/CATCH ロジックを使用しても
> 意味がありません。Open メンバ関数を使って、例外状態を直接調べてください。
> 例外処理の方法については、「例外処理 (MFC)」を参照してください。
---------------- 中略 -------------------
> このコンストラクタに引数 hFile と lpszFileName を指定すると、
> CFile オブジェクトが構築され、指定されたパスにある
> オペレーティング システム
> ファイルが開かれます。このコンストラクタは、先に説明したコンストラクタ
> の関数に Open メンバ関数を組み合わせたものです。このコンストラクタは、
※
> ファイルを開くときにエラーが発生すると、例外をスローします。一般に、
> この例外がスローされた場合、発生したエラーは修復できないため、
> ユーザーに警告する必要があります。
例にTRY/CATCH ロジックがない。
CATCHの説明にありました。
#ヨタ話だけどさ
> 2 つの関数を使うと、ファイルを開くときに、失敗する可能性があっても
> 安全に 操作できます。
例外が発生しないことを指して「安全」かよ。
発生した方が安全なことだってあるし、「発生しても安全なこと」が本当の「安全」だ
ろうに。
話的にはお題からそれておりますが、
要は、コンストラクタでOpenまでやってしまうパターンだと
例外でOpenエラーを返すしかないから使うのだったら
Open無しのコンストラクタを使ってメンバー関数のOpenを
使えって意味ですよね。
これはこれで理屈は通っているような気がしますけど。
安全と言う表現に関してはどうかと思いますけれど、
言いたい事の骨子は理解できるかなと。
にしても何故、新しいMSDNになってメンバー関数毎のスローする例外の
記述が無くなったんだろう。
MSDNフォーラム辺りで質問投げてみるしかないかなぁ。
あそこなら多分、MSの社員も見ているはずだし。
と言うわけで、例外の記述が無くっている件についてMSDNフォーラムで
質問を投げてみます。
MSDNフォーラムも閲覧だけならゲストで出来たはずなので問題ないだろうし。
あちらを立ち上げた所であちらのリンクとこちらに張って
こちらの質問を閉じますのでそれまではこのままで御勘弁を。
前述の通り、MSDNフォーラムの方に質問を投げてきました。
フィードバック » Visual Studio ドキュメント フィードバック » MSDN上のクラスのメ
ンバー関数の表記にthrowする例外の記述が無い
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=976636&SiteID=7
この掲示板ではMS関係者がレスポンスをくれる可能性が極めて低いと思いますので
この発言で一度締めたいと思います。
CFileクラスの話については話を続けるのであれば、
別にスレッドを起こしたほうが良いかなとも思いますので
必要ならスレッドを起こしてください。
色々と貴重な意見ありがとうございました。
これ以降のやり取りに興味がある方は上記のスレッドをご覧ください。
まあ、実際にMSからレスポンスがあるかはわかりませんけれど。