1
#include <fstream>
#include <iostream>
#include <stdexcept>
using namespace std;

class FileNotFound: public logic_error
{
public:
    explicit FileNotFound(const string& _Message):logic_error(_Message){}
};
int main()
{
    try
    {
        ifstream file;
        file.open("NoExistingFile");
        if (file.fail())
            throw FileNotFound("");
    }
    catch(const FileNotFound &e)
    {
        cout << "FileNotFound" << e.what();
    }
    catch(const exception &e)
    {
        cout << e.what();
    }

    return 0;
}

出力:FileNotFound

クリーンコード(ロバートマーチン)ですか?std::exceptionは「エラーの場所」を提供しません。Clean Code A Handbook of Agile Software Craftsmanship(Robert Martin)->第7章:エラー処理->コンテキストに例外を提供する

4

3 に答える 3

3

引用された段落を考慮すると、何が起こったかの情報を取得するだけで、例外がスローされた場所からの情報を取得しないため、明らかにクリーンではありません。したがって、デバッグのためにトレースバックすることはできません。

標準の例外を使用する代わりに、ブースト例外を使用することをお勧めします。これは、例外がスローされた場所からコンテキストを提供できるためです。

于 2012-12-05T09:41:49.777 に答える