- PR -

VC++2005と2003のtry-catch の違いについて

1
投稿者投稿内容
タケ
会議室デビュー日: 2007/09/26
投稿数: 3
投稿日時: 2007-09-26 10:35
下記のコードがVC++2003ではcatchしてくれるのですが、2005では
catch出来ず「ハンドルされていない例外が発生しました〜書き込み中にアクセス違反が発生しました」で終了してしまいます。
何か設定が有るのでしょうか?
ヘルプや過去ログを探しましたが解決出来ません。
どなたか解る方教えて下さい。宜しくお願いします。

try
{
int *ptr = NULL ;
*ptr = 0 ;
}
catch(...)
{

}
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-09-26 12:45
こんにちは。

引用:

タケさんの書き込み (2007-09-26 10:35) より:
下記のコードがVC++2003ではcatchしてくれるのですが、2005では
catch出来ず「ハンドルされていない例外が発生しました〜書き込み中にアクセス違反が発生しました」で終了してしまいます。



こことやっていること、同じですね。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39501&forum=7


もしかしてC++仕様の重箱の隅っこには定義されているのかもしれませんが、
そもそも、どこからスローされているのかよく分からないような例外がとんでくること自体、
気持ち悪いし、それをキャッチするなんてC++らしくないように思います。

C++には「コードに記述されていることがすべて」であって欲しいと思います。

少なくともNULLポインタかどうかのチェックはしてから参照するのが基本だと思います。
コード:
int *ptr = NULL ; 
・・・
if (ptr) {
	*ptr = 0 ; 
}
else {
	・・・
}


タケ
会議室デビュー日: 2007/09/26
投稿数: 3
投稿日時: 2007-09-26 12:59
返信ありがとうござます
目的は続行不能の致命的エラーが発生した場合に
作業中のデータを保存する為です
データ保存後は強制的に終了します
VS2003では問題なく期待道理に動いていました
一応書き込んだコードはワザとエラーを発生させる為です

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-09-26 13:28
引用:

タケさんの書き込み (2007-09-26 12:59) より:
目的は続行不能の致命的エラーが発生した場合に
作業中のデータを保存する為です


致命的なエラーが発生したときにデータが正常であることを保障するのは困難なので無用の長物では?とも思います。

作業中のデータの保存が目的なら、MemoryMappedFileを使って、他のプロセスと共有したメモリにデータを格納しておくのは駄目ですか?これならプロセスがどのような手段で強制終了されても、データが残りますけど。

メモリ管理部分を自前である程度面倒を見なくてはならないので、実装は大変かもしれませんが。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2007-09-26 13:32
キャッチできない例外は、SEH(OSの発行する例外)ですか?

であれば、コンパイルオプションの問題ですね。
VS2005 から例外の段取りが若干変わってるのでその影響だと思います。

プロジェクトのプロパティを開き下記のツリーをたどって
構成プロパティ-C/C++-コード生成
C++の例外を有効にする の項目を
はい - SEH の例外あり(/EHa)
にすれば、キャッチできるはずです。

一応テストコード(例文そのままをmainに入れただけですがw)ではキャッチできました。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
タケ
会議室デビュー日: 2007/09/26
投稿数: 3
投稿日時: 2007-09-26 13:48
>++の例外を有効にする の項目を
>はい - SEH の例外あり(/EHa)
>にすれば、キャッチできるはずです。

キャッチできました。
本当にありがとう御座いました

1

スキルアップ/キャリアアップ(JOB@IT)