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

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

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

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

Q&A

解決済

2回答

3150閲覧

例外クラスとstd::exception

BeatStar

総合スコア4958

C++

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

0グッド

0クリップ

投稿2017/06/05 03:35

C/C++でやっています。

C/C++で例外処理ってありますよね。

今までは int型で投げていたのですが、std::exception を継承すればより簡単にできるようなので
それに切り替えようかと思っています。

ここまではいいのですが、試しにやってみたところ、
なぜかエラー...

普通のエラーは読めて、ある程度パターンから推測 & 修正できますが、STL関連なので...

C++

1#include<iostream> 2#include<exception> 3#include<string> 4 5namespace EXCEPTION{ 6 // 例外用クラス 7 class MyException : public std::exception{ 8 public: 9 MyException( const std::string &str ) : std::exception(str){} 10 ~MyException(){} 11 }; 12 13 // 例外を投げる関数 14 void ThrowException( void ) throw(MyException){ 15 throw MyException( "DLLがない...の?" ); // 今回は"例外用クラス"に関してなので 確実に投げる。 16 } 17 18 // 実際に例外を受け取る関数 19 void Check( void ){ 20 try{ 21 ThrowException(); 22 }catch( MyException &e ){ 23 cout << e.what() << endl; 24 } 25 26 return; 27 } 28} 29 30int main( void ){ 31 EXCEPTION::func(); 32return 0; 33}

としました。

ですがコンパイルしようとすると

(ファイル名): In constructor 'EXCEPTION::MyException::MyException(const string&)': (ファイル名):(行番号):(列数?): error: no matching function for call to 'std::exception::exception(const string&)' MyException( const std::string &str ) : std::exception(str){}

と出てコンパイルできません。

何がいけないのでしょうか?

std::exceptionはpublicで継承しているし、上記でいう、MyExcepitonクラスのコンストラクタから親クラスに 引数を渡しているはずなのに...

普通に

C++

1#include<iostream> 2#include<exception> 3#include<string> 4 5namespace EXCEPTION{ 6 class MyException : public std::exception{ 7 public: 8 MyException( const std::string &str ) : m_error(str){} 9 ~MyException(){}; 10 11 const char* what( void ){ return m_error.c_str(); } 12 private: 13 std::string m_error; 14 }; 15 16 ... // 以下省略 17} 18

とすれば普通に動きますが、継承の意味があまりない...
( せいぜい、親クラスである std::exception で受け取れるぐらい )

それだったら独自のクラスとして定義すればいいと思うし...

何がいけないのでしょうか。

もしかすると私のスペルミスとかかもしれないし...
と考えてチェックしてみましたが、
私からすると「間違っていない」。

どうすればいいでしょうか。

Boostにも boost::exception があるようですが、
できれば C++ の範囲のみ ( C++で提供されているもの ) で出来たらいいのですが...

[情報]
言語 : C/C++
コンパイラ : MinGW
知りたいこと: C++でのstd::exceptionを継承した独自の例外クラス定義方法

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

何がいけないのでしょうか?

std::exception()のコンストラクタstring const&を受け取れるものがないからです。
デフォルト・コンストラクタとコピー・コンストラクタしか無いようです。
どうやら、std::exceptionは例外の追加情報を運ぶ機能を持っていないようです。

( せいぜい、親クラスである std::exception で受け取れるぐらい )

what()が仮想関数で定義されていますから、それをオーバーライドすることでご自身で返却するメッセージを定義できます。

つまり、「普通に」書かれた内容でほぼ適切な定義になっていると思います。
what()の元定義がconstかつnoexceptionなのでこれらが必要です。(C++11以降の場合)
因みにconstを付けないと、オーバーロードになってしまいます。

下記にて"my exception"が表示されます。

C++

1#include<iostream> 2#include<exception> 3#include<string> 4 5namespace EXCEPTION{ 6 class MyException : public std::exception{ 7 public: 8 MyException( const std::string &str ) : m_error(str){} 9 ~MyException(){}; 10 11 const char* what( void ) const noexcept { return m_error.c_str(); } 12 private: 13 std::string m_error; 14 }; 15} 16 17int main() 18{ 19 try 20 { 21 throw EXCEPTION::MyException ("my exception"); 22 } 23 catch(std::exception& e) 24 { 25 std::cerr << e.what(); 26 } 27}

投稿2017/06/05 04:19

Chironian

総合スコア23272

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

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

0

std::exceptionクラスは、const std::string&を受け取るコンストラクタを持っていないですね。
<stdexcept>ヘッダで定義されるstd::runtime_errorクラスとかは持っていますが。

例外クラスを設計する際は、最初に<stdexcept>で定義されるクラスのいずれかの分類の下に属することができるかを検討したほうが、作るのが楽になりますね。それに属しないならstd::exceptionから派生して、自分でエラー文字列を管理することになります。

投稿2017/06/05 04:00

faithandbrave

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問