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

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

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

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

Q&A

解決済

2回答

1363閲覧

C++で例外処理で文字列を送出するパターンとクラスを送出するパターンで別々の処理をさせたい

tetta_8

総合スコア1

C++

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

0グッド

0クリップ

投稿2020/06/15 13:40

C++で例外処理で文字列を送出するパターンとクラスを送出するパターンで分けたい

C++の例外処理を勉強中です。
例外処理で「const char*」を受け取る場合と、
「クラス型」を受け取る場合を実装したのですが、
「クラス型」のcatchを後に記述すると、「const char+」の例外処理しか実行されません。

「クラス型」は先に記載するしか対応方法はないのでしょうか?
また、「const char*」の文字列も文字化けしてしまい、正しく表示されません。

実行結果【正常時】

0~100の整数を入力してください:0 正常動作 範囲内です。

実行結果【例外 文字列を受け取ることを想定】

0~100の整数を入力してください:-1 文字列のキャッチ d@  // 「負の数が入力されました。」と表示したいが文字化けする

実行結果【例外 クラス型を受け取ることを想定】

0~100の整数を入力してください:101 文字列のキャッチ  // クラス型ではなく「const char*」のcatchが動いてしまう。

該当のソースコード

cpp

1#include <iostream> 2 3using namespace std; 4 5class ErrorOverFlow{}; 6 7bool check_0_100(int x){ 8 if(x < 0) 9 throw "負の数が入力されました。"; 10 else if(x > 100) 11 throw ErrorOverFlow(); 12 else 13 return true; 14} 15 16int main(){ 17 int num; 18 cout << "0~100の整数を入力してください:"; 19 cin >> num; 20 21 try{ 22 if(check_0_100(num)){ 23 cout << "正常動作" << endl; 24 cout << "範囲内です。" << endl; 25 } 26 } 27 28 catch(const char* str){ 29 cout << "文字列のキャッチ" << endl; 30 cout << str << endl; 31 } 32 33 catch(ErrorOverFlow){ 34 cout << "クラスのキャッチ" << endl; 35 cout << "100より大きな数値が入力されました。" << endl; 36 } 37}

試したこと

①「catch(ErroOverFlow)」を「catch(const char* str)」より先に記載
⇒catch(ErroOverFlow)の動作をすることを確認

補足情報(FW/ツールのバージョンなど)

・OS:Windows10
・ターミナル:powershell
・コンパイラ:g++ Ver5.3.0
・エディタ:VS Code

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

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

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

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

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

guest

回答2

0

ベストアンサー

g++9.2.0では問題なく動いています。
g++のバージョンを上げてみては?


「クラス型」は先に記載するしか対応方法はないのでしょうか?

そんなことはありません。
スーパー(親)クラスとサブ(子)クラスをcatchしている場合はサブ(子)クラス先に書かなければなりませんが。

動作確認したコードは質問に貼った通りのものでしょうか?
例えば以下のようなコードの場合、msgはスコープを抜けて解放されるためうまく動きませんが…

C++

1bool check_0_100(int x){ 2 string msg; 3 if(x < 0) 4 { 5 msg = "負の数が入力されました。"; 6 throw msg.c_str(); 7 } 8 else if(x > 100) 9 throw ErrorOverFlow(); 10 else 11 return true; 12}

投稿2020/06/15 14:27

編集2020/06/15 15:14
SHOMI

総合スコア4079

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

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

tetta_8

2020/06/15 15:08

ご確認頂きありがとうございます。 最初にご指摘いただいたバージョンの問題があったようで、9.3.0では、意図通り動作しました。 コンパイラのバージョンによる違いは判りませんが、今後は複数の環境で試してみます。
guest

0

そもそも例外クラスじゃないものをthrowするべきではありません。

投稿2020/06/15 13:49

yumetodo

総合スコア5852

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

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

tetta_8

2020/06/15 15:11

ご指摘ありがとうございます。 空のクラスや文字列を投げられるとネットでみたので、試してみたかったので、簡易に作ってしまいました。 正規の開発も想定し、今後は例外クラスの使い方も勉強していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問