古代の反パターンの1つは、エラーステータスをチェックし、「操作が失敗しました」の代わりに「操作が失敗しました」などのかなり役に立たないメッセージを返すことです。私はC++ファイルの入出力操作を例外で失敗させ、失敗した理由についてのエラーメッセージを取得します。具体的には、ファイルの作成が失敗したときにofstreamオブジェクトで例外が発生し、「許可が拒否されました」や「ファイルやパスがありません」などの便利なメッセージが表示されます。C++でファイルを作成するときIOエラーメッセージを取得するには?
これはC#やJava、Pythonなどの言語では簡単ですが、何らかの形でこのC++を実行する方法はありません。デフォルトでは、iostreamオブジェクトはただ静かに失敗します。いくつかのグローバルエラーコードがありますが、私はむしろ例外を持っています。検索の多くの後、私はあなたが次のコード行使用して例外を有効にすることをお読みください。)
my_file.exceptions(flog.exceptions() | std::ios::failbit | std::ifstream::badbit);
動作しますが、今上げます例外がstd::ios_base::failure
とex.what(ある「basic_iosのような無用の文字列を返します。 :クリア "。 std::ios_base::failure
は、例外メッセージを出す.code()。message()を持つsystem_errorから継承されると考えられていました。この奇妙さをここに控えておき、実際のエラーメッセージを返すべきではないことを決めた人に指先を指摘しないようにしましょう:)。問題は、C++ 11とG ++ 4.8.4でコンパイルしても、std::ios_base::failure
がsystem_errorから実際に継承されていないことがわかります。
質問C++ 11モードでコンパイルする場合でもstd::ios_base::failure
は4.8.4、最新のG ++でSYSTEM_ERRORから継承されていないのはなぜ
- ? GCCのC++ 11の実装はこの分野では不完全ですか、何かもっと何かをする必要がありますか?
- IO操作がC++で失敗し、エラーメッセージが表示されたときに、例外を発生させるという目標を達成するにはどうすればよいですか?最新のC++ 11やC++ 14でもこれを行う方法はありませんか?代替案は何ですか?
ここにサンプルコードがあります。あなたはcompile and run it hereです。
#include <iostream>
#include <fstream>
#include <system_error>
int main() {
try {
std::ofstream flog;
flog.exceptions(flog.exceptions() | std::ios::failbit | std::ifstream::badbit);
flog.open("~/watever/xyz.tsv", std::ios::trunc);
}
catch (const std::ios_base::failure &ex) {
std::cout << "ios_base::failure: " << ex.what();
}
catch(const std::system_error& ex) {
std::cout << "system_error: " << ex.code().message();
}
}
はhttp://en.cppreference.com/w/cpp/error/system_errorを見つけるためにGoogleしなければならなかったが、おかげで – strangeqargo