
お世話になります。
現在C++でプログラミングを行っていますが、例外処理で困っています。
次のようなコードを書きました。
try{
m_Session.DestroyDatabasePool();
}catch(CException e){
m_Share.WriteLogFile("キャッチ中", LOG_INFO );
}
しかし、これだとcatchが行われず、catch(CException e)部分を(...)にすると例外処理が実行されます。
例外の詳細を知りたいので、どうしても(CException e)で行いたいです。
説明が不十分かもしれませんが、何かご存知でしたら、ご教授お願いします。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
初心者ながらコメントさせて頂きます。
DB関連の例外処理なら、普通CDBExceptionを
使うのでは・・・
CDBExceptionで拾った例外は文字列としてm_strError
に格納されています。
デバックならm_strErrorをクイックすれば何が入ってるか見れると思います。
No.6
- 回答日時:
えーとですね。
例外を捕らえるには、
try{
・・・
} catch( aaa e){
・・・
} catch( bbb c){
・・・
} catch(...){
・・・
}
とやります。
#1の方がおっしゃっているのは、throwしている例外を聞いているのです。
つまり、使用しているメソッドが何かをスローしているのであれば、スローした型を知っている必要があります。
型が分からなければ、catch(...)で全ての例外をキャッチするしかありません。
dainnnさんは、CException をキャッチしたいのですが、このためには、m_Session.DestroyDatabasePool()が、CException をスローしていなければ、絶対にキャッチできません。
そこで#3さんが言うには、DestroyDatabasePoolは、CException またはその他を故意にスローする仕様ではないとおっしゃているのです。
その補足で、例外の種類が記述されていますね!
これは、メモリのアクセス違反です。
つまりシステムがスローした例外です。
これは、CException 型ではないので、catch(...)でしかキャッチできない訳です。
結論から言うと、メモリのアクセス違反が原因なので、例外をキャッチしても問題の詳細は不明と思います。
それで、例外の質問の回答ですが、DestroyDatabasePoolメソッドが内部に
throw CException e;
↑この記述が無ければ、catch(CException e)でキャッチできないと言う事になります。
No.5
- 回答日時:
>いや、だとすれば catch (...) に捕まるはずがない。
| m_Share.WriteLogFile(szCause, LOG_INFO )でメモ帳に結果が出力するようにしています。メモ帳への出力は問題なく動きます。(例外処理が実行できてないので出力できていませんが、他の部分では出力できています)
ここの部分から、そもそもcatch (...) に捕まっていると思い込んでいると想像してます。
もし最近のバージョンは例外を発生するようになっているとすれば OException にしたら捕まえられるかもしれません。
No.4
- 回答日時:
> m_SessionはOsessionクラスの変数名です。
OsessionクラスはオラクルDBを操作するためのクラスです。それが MFCで定義された例外:CExceptionをthrowするとは考え難いのですけど。
> 手元にあるマニュアルを見る限りでは、> DestroyDatabasePool() は例外が発生するようには書かれていません。
> それが正しい動作だと思えます。
いや、だとすれば catch (...) に捕まるはずがない。
No.3
- 回答日時:
まず、環境を詳しく書きましょう。
単にC++の質問と言っても処理系やクラスライブラリが色々あります。
超能力者ではありませんので、あなたがどんな環境で開発しているのかは他に人にはわかりませんよね。
m_Session という書き方や CException から、Microsoft の VC++ を使用している。
DestroyDatabasePool() や COraDB から、Oracle Objects for OLE C++ Class Library を使っていると想像して回答します。
手元にあるマニュアルを見る限りでは、DestroyDatabasePool() は例外が発生するようには書かれていません。
それが正しい動作だと思えます。
この回答への補足
色々と勉強不足でした。すみません。
環境としては、言語C++、データベースはOracle9iでOracle Objects for OLE9.2.0.4.8を使用しています。
C++でファイル名.exeという実行ファイルを作成し、サービスとして起動しています。このサービスを停止するときに、
「ファイル名.exe -アプリケーションエラー-
"0x01d87008"の命令が"0x000000d9"のメモリを参照しました。メモリが"written"になることはできませんでした。」
というエラーが起こりました。このエラーが起こる場所をログをメモ帳に出力することで調べました。その結果、DestroyDatabasePool() 部分で問題が発生していました。Oracle8iでは、問題なく停止できていたので、Oracleかoo4oのバージョンの問題でしょうか?
No.2
- 回答日時:
> このコードの中で、m_Session.DestroyDatabasePool();
> 部分でエラーが起こったので、例外処理を行いました。
僕の質問に答えてください。ここで何が throw されるのですか? CException では'ない'のでは?
m_Session は何ですか? クラスのインスタンス? MFCが提供しているものですか?
この回答への補足
m_SessionはOsessionクラスの変数名です。OsessionクラスはオラクルDBを操作するためのクラスです。
OsessionクラスのDestroyDatabasePool()メソッドの中身がわからず、何がthrowされているかわかりません。
色々調べて解らなかったので投稿したのですが、質問の内容が曖昧でした。
もう一度しっかりコードを調べてみます。すみませんでした。
No.1
- 回答日時:
m_Session.DestroyDatabasePool() は何を throw するのですか? CException では'な
?この回答への補足
ご回答ありがとうございます。
Cを始めたばかりで、例外処理についてわかっていないので、例外処理を行う前段階から説明します。
最初にこのようなコードを書きました。
・
・
・
oresult COraDB::TerminateDatabasePool()
{
m_Session.DestroyDatabasePool();
return m_Session.Close();
}
・
・
・
このコードの中で、m_Session.DestroyDatabasePool();
部分でエラーが起こったので、例外処理を行いました。そして、エラーの詳細が知りたくて、次のようにしました。
oresult COraDB::TerminateDatabasePool()
{
try{
m_Session.DestroyDatabasePool();
}catch(CException e){
TCHAR szCause[255];
e.GetErrorMessage(szCause, 255);
m_Share.WriteLogFile(szCause, LOG_INFO );
}
return m_Session.Close();
m_Share.WriteLogFile(szCause, LOG_INFO )でメモ帳に結果が出力するようにしています。メモ帳への出力は問題なく動きます。(例外処理が実行できてないので出力できていませんが、他の部分では出力できています)
部分的でわかりにくいかも知れませんが、よろしくお願いします。例外処理のやり方が違っていたらすいません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java すみません。助けてください。 javaについての質問です。 integerに変換できない数値をエラー 5 2022/05/18 19:16
- 情報処理技術者・Microsoft認定資格 (パイプライン処理)基本情報技術者の演習問題について 1 2023/03/11 17:47
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- 英語 分離不定詞 1 2023/07/16 17:29
- Visual Basic(VBA) 特定の文字を条件に指定範囲のデータを貼り付けるVBA 3 2023/01/15 06:14
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- フィギュア・ドール・ぬいぐるみ 余ったプライズ品の行方~ゲームセンターなどで勤務されている方へ 1 2022/11/22 13:14
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- その他(悩み相談・人生相談) 4泊の海外旅行に知らない人がついてきます。ありえなくないですか? 8 2023/04/18 20:23
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
『μg』の読み方と意味。
-
GALAXY S21+ですが、デュアルS...
-
画像処理のラプラシアンフィル...
-
【C#】 複数行GcTextBoxのフォ...
-
名古屋の栄と錦は治安悪い?
-
ワンセグデータの管理
-
Zendにてforwardする際に、POST...
-
vba メモリーリーク
-
C++の例外処理
-
NumericUpDownの数値を選択済み...
-
VB.NETのテキストボック...
-
ob_start()した後、ob_flush()...
-
数式中の文字をCambria Math以...
-
word
-
イラレでダブルクリックで文字...
-
ファーストピアスのキャッチが...
-
テキストの重複する行をすべて...
-
Illustrator 10の『データの書...
-
PowerPoint SmartArtの箇条書...
-
Illustratorテキストエリアへ塗...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
名古屋の栄と錦は治安悪い?
-
VB.NET でのLaod/unLoad につ...
-
VB.NETのテキストボック...
-
項目数は英語で
-
テキストボックスからフォーカ...
-
NumericUpDownの数値を選択済み...
-
『μg』の読み方と意味。
-
フォームを開く時のイベント処理
-
mailの送信音がしなくなったの...
-
vba メモリーリーク
-
C++の例外処理
-
VBのレコードセットを閉じない...
-
ヒント表示について
-
シリアル通信について
-
ブック開いたときのフォーカス指定
-
シリアルフラッシュメモリをな...
-
デュアルモニタ×2分岐
-
120Gのハードディスクを2個...
-
phpからxmlの上書き
-
TextBoxにカーソルがあるかない...
おすすめ情報