http://en.cppreference.com/w/cpp/error/exception&http://en.cppreference.com/w/cpp/io/basic_fstreamを参照して、スローされる可能性のあるI/O例外を探しました。カスタム例外クラスを作成でき、サンプルコードを提供するWebサイトがたくさんあることは知っていますが、特にベストプラクティスに関するガイダンスが必要です。
また、生活を楽にするために集中して使うべき図書館はありますか?
C ++ 11では、低レベルのエラー用に新しいヘッダーsystem_errorが導入されています。独自のエラーカテゴリを作成することができます。
これは、最新のC++で独自のエラー処理を作成するための良い出発点になる可能性があります。
事前定義された例外はたくさんありますが、一般的には、独自に定義するかstd::runtime_error
、最初の近似としてスローします。
一般的に、あなたは拡張するでしょうstd::runtime_error
、またはそれの別の派生物std::exception
がより適切です。
例えば、
class io_error : public std::runtime_error {
public:
using std::runtime_error::runtime_error;
};
質問のライブラリ部分に答えるには、を見てくださいboost::exception
。
Boost例外はスレッド間を移動でき、例外operator<<
をキャッチ(およびオプションで再スロー)すると、情報を動的に例外にアタッチできます。また、BOOST_THROW_EXCEPTION
マクロは、ファイル、行、および関数名を式に記録して、きれいに印刷できるようにします。
それ以外の場合は、プロジェクトに独自の例外を定義するのが一般的な方法です。しかし、私はあなたが話している「javaのようなユーティリティ」に精通していないので、より具体的な答えを出すのは難しいです。
より一般的な注意として、C ++の設計原則の1つは、要求したことを実行することであり、それ以上のことは何もしません。これは、場合によっては祝福であり、場合によってはより多くの作業を意味します。これはJavaとはまったく異なります。throw
例外の主な目的は、通常のプログラムフローを/で中断することcatch
であり、C++はまさにそれを実行します。
単純な文字列メッセージが必要な場合:
struct E: std::exception {
const char* msg;
E(const char* msg_): msg(msg_) {}
const char* what() const { return msg; }
};
// ...
throw E("invalid operation name");