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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Q&A

解決済

3回答

409閲覧

例外の使い方が正しいのか知りたいです。

__ook

総合スコア49

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

0グッド

0クリップ

投稿2019/12/12 07:08

例外の使い方が正しいのか知りたいです。
以下のようにruntime_errorで例外送出したのですが、場合によって処理を分けたい場合がよくあります。

cpp

1#include <iostream> 2#include <fstream> 3#include <string> 4 5using namespace std; 6 7 8auto file_write(string file) 9{ 10 ofstream ofs(file); 11 12 if (ofs.fail()) throw runtime_error("ファイルオープンに失敗しました"); 13 14 ofs << "ok" << endl; 15} 16 17auto in_check(int number) 18{ 19 if (number > 50) throw runtime_error("数値が不正です"); 20} 21 22int main() 23{ 24 try { 25 file_write("sample.txt"); 26 } 27 catch (runtime_error& msg) 28 { 29 cout << msg.what() << endl; 30 return; 31 } 32 33 int n; 34 try { 35 cin >> n; 36 in_check(n); 37 } 38 catch (runtime_error& msg) 39 { 40 cout << msg.what() << endl; 41 n = 0; 42 } 43}

こういった場合上記のように処理をちょくちょく分けているのですが、これは冗長でしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

こういった場合上記のように処理をちょくちょく分けているのですが、これは冗長でしょうか?

今回のケースは、2つの処理内容が明らかに異なる(片方はログだけ、もう片方はログとリカバリ処理)ので、少なくともcatch文は分けるべきです。

そのために、tryブロックを分ける、投げる例外の型を変える方法があります。
どちらが好ましいかは、やはりケースバイケースです。tryブロックを分けると「一連の処理」が分断されて見にくくなる場合もありますが、エラー・リカバリ処理が必要な処理と不要な処理で明確に分かれるのであれば、tryブロックを分けることで却って読みやすくなる場合もあります。

投稿2019/12/12 08:23

Chironian

総合スコア23272

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

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

0

別にいいんじゃないですかね。ただし、例外を補足するときに、回復できないエラーをcatchしないように、例外クラスそのものを分けたほうがいいかもしれませんが。

あとofs.fail()の部分ですが、exceptionsというメンバー関数もご活用ください。
https://cpprefjp.github.io/reference/ios/basic_ios/exceptions.html

投稿2019/12/12 07:24

yumetodo

総合スコア5850

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

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

0

今回のケースに限って言うのであれば、例外の型を変えるのも手かと。

if (number > 50) throw runtime_error("数値が不正です");

c++

1 if (number > 50) throw invalid_argument("数値が不正です"); 2

一般論としては、他の方の回答の通りだと思います。

投稿2019/12/12 09:29

編集2019/12/12 12:08
Mithra

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問