質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

4回答

10277閲覧

C++の例外について

ryo_se

総合スコア68

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/10/22 05:13

現在C++の例外を勉強中です。

throwに関して今は調べているのですが、
下記の例の場合、CFileExceptionでcatchさせるにはどのようにすればよいのでしょうか?
調べてもcharやintのcatch方法しかでてこないため、ご教授願いたいです。

また、JavaのExceptionのように全ての例外をキャッチする方法はありますでしょうか?
その場合におけるスタックトレースの出力方法も知りたいです。

try{ throw (CFileException); //左の記述方法が知りたい }catch(CFileException* e){ m_errMsg.Format("ファイルが読み込めません"); e->Delete(); return false; } return true; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

CFileException例外をスローしたい場合は、AfxThrowFileException関数を使ってください。コンストラクタで直接CFileExceptionオブジェクトを作ることは非推奨としているようです。
他のCException派生クラスにも、それぞれに対応するヘルパー関数が用意されているのでそれを使ってください。
https://msdn.microsoft.com/ja-jp/library/e583tzca.aspx

MFCの例外処理はめんどくさいので、MFC内部からスローされる例外を処理するのではなく、自前の例外処理を実装するならMFCを使わずにSTLのexception系を使うことをお勧めします。

投稿2016/10/22 15:56

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

CFileException はクラスなので、new してインスタンスを作成する必要があります。

throw new CFileException();

となります。

投稿2016/10/22 08:20

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

一般的な方法を回答します。(MFCは使ってないので)

throw (CFileException);

これはコンパイル・エラーになりますよね。throwできるのは「型」ではなくインスタンスです。
CFileExceptionにデフォルト・コンストラクタがあるなら、throw (CFileException());で投げることができます。デフォルト・コンストラクタがないなら、存在するコンストラクタを呼び出すように記述して下さい。()の中にそのコンストラクタに必要なパラメータを書くだけです。

文法的にはcatch(CFileException& e)で受け取れる筈です。この場合、eをdeleteする必要はありません。

また、JavaのExceptionのように全ての例外をキャッチする方法はありますでしょうか?

C++言語仕様的にはepistemeさんが記載されているようにcatch(...)しかないです。
しかし、これはどんな例外が投げられたのか判定できないため、例外を投げる側が発生したエラーをログに記録する等の対処をしないと、原因不明なバグに繋がるので使うのはかなり危険です。

その場合におけるスタックトレースの出力方法も知りたいです。

スタックトレースはC++としてはサポートしていません。boostがサポートしてくれればよいのですか残念ながらないようです。もしかしてどこかにマルチプラットフォームなスタックトレース・ライブラリがあるかもしれませんが、私の知る限りありません。処理系毎に苦労して作るしかないだろうと思います。

投稿2016/10/22 06:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

throw new CFileException(引数があれば指定する); でよくね?

ただし、MFCの「ポインタをthrowする」のはフツーやらん。
確実にdeleteするのが困難なケースがあるので。

JavaのExceptionのように全ての例外をキャッチする方法はありますでしょうか?

catch (...) で如何なる例外もcatchできる。が、フツー使わん。

std::exception あるいは <stdexcept> に定義された標準例外から導出した例外クラスであれば

catch ( const std::exception& ex) ですべて捕まえられる。

その場合におけるスタックトレースの出力方法も知りたいです。

言語仕様にはそんな機能はない。Javaが親切なだけ。

投稿2016/10/22 05:46

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問