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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

3回答

8134閲覧

【c++】キャスト時の例外処理対策

SeventhBell

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2016/05/24 08:07

【質問】(c++今日はじめました)
例えば、string→intの際、intの許容量を超える場合に皆様はどのように対策されていますか?

【求動作】
"intの許容量を超えているため"ということがわかるエラーを出力したいです。
(方法があれば変換前にチェックするでも、例外処理を拾うでも)
初心者ゆえ視野が狭いので、求動作以外にも、私はこうしてますという意見も募集です。

【例外処理例】

string str = 2147483648; // intの許容量を超える int i = std::stoi(str);

【やってみたこと】
試しにtry文を書いてみましたが、以下のエラーを吐きcatchできません。
可能なら、エラー内容1の様な情報が得られると嬉しいです。。。

--ソース一部

string str; cin >> str; try { cout << std::stoi(str) * 2 << endl; } catch (char *e) {> // これだとハンドルできない // 引数に...を指定すればそのcatchがハンドルするけど・・・ }

--エラー内容1(VisualStudio2015でデバッグ実行したとき)

${アドレス1} で例外がスローされました (ConsoleApplication1.exe 内): Microsoft C++ の例外: std::out_of_range (メモリの場所 ${アドレス2})

--エラー内容2(デバッグ実行しなかったとき)

Debug Error!
Program:
...${実行ファイルのアドレス}
abort() has been called
(Press Retry to debug the application)

【環境】
OS:windows7 64bit
処理系:Visual C++
IDE:VisualStudio2015

【余談】
例えば、javaのtry文では特定の拡張されたExceptionクラスを指定しなくともとりあえずExceptionを指定しておけば、スタックトレースを吐かせられますが、c++では細かく指定しないとだめなのでしょうか・・・?

稚拙で申し訳ないですが、ここまで、ご覧くださりありがとうございます!
質問方法への指摘等でも結構ですので、ぜひご意見ください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

STLの例外クラスはexceptionクラスから派生させているので、とりあえず
catch(std::exception &e)
としておけばキャッチできます。
例外の種類によって処理を分けたいときは、

C++

1try 2{ 3 int a = std::stoi(str); 4} 5catch(std::invalid_argument &e) 6{ 7 // 文字列が数値でなかったときの処理 8} 9catch(std::out_of_range &e) 10{ 11 // 数値がintの範囲外だった時の処理 12}

このように細かく指定します。

投稿2016/05/24 08:25

編集2016/05/24 08:28
catsforepaw

総合スコア5938

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

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

SeventhBell

2016/05/24 08:37

なるほど、ちゃんと派生元があるんですね! c++のexceptionのリファレンス拝読しました。 what関数を利用したらそれっぽい内容(stoi argument out of range)が出たのでもうちょっと想定外例外へ対応させる方法も考えてみます。
guest

0

C言語になりますが、strtol関数はerrnoから判定できるようです。
オーバーフロー、アンダーフローのときにERANGEが設定される。
https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strtol.3.html

C++の場合、std::strtolで同様の動きになるようです。

ご提示のstd::stoiでも、内部的にはstrtolを使っているようなので、同様の判定ができるみたいですね。
http://cpprefjp.github.io/reference/string/stoi.html

投稿2016/05/24 08:19

編集2016/05/24 08:20
ttyp03

総合スコア16996

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

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

SeventhBell

2016/05/24 08:27

後程、リンク先を拝見してみます。 取り急ぎお返事まで。
guest

0

こんにちは。

たぶん、下記でキャッチできると思います。

catch (std::out_of_range& e)

C++では原則としてキャッチしたい例外を指定します。

catch (...)

とすれば全ての例外をキャッチします。(SEH除く)

後、C++でスタックトレースを吐くためにはかなり面倒なプログラムが必要です。しかし、Visual Studioでブレークを貼っておけば簡単に見れます。

投稿2016/05/24 08:15

Chironian

総合スコア23272

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

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

SeventhBell

2016/05/24 08:26

キャッチできました。 おっしゃられる面倒なプログラムを実装しない場合は、あらかじめ例外を想定しないとですかね。。。 VisualStudioも使い始めなのでご教授ありがとうございます。
Chironian

2016/05/24 08:45

C++でスタックトレースを表示させるには、IDEの機能を使うのが最も簡単です。 例外をcatchしたところにブレークを張っていれば容易に見れます。 あらかじめ例外を想定しなくても全ての例外をcatchすればそれが可能です。 JavaとC++では言語の考え方が大きく異なります。 Javaで簡単にできることがC++では苦労するケースは少なくないです。 逆に、C++にできることがJavaではどんなに苦労してもできないケースも少なく無いです。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問