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

考虑到引用的段落,它肯定是不干净的,因为你只是得到了发生的事情的信息,但你没有从抛出异常的地方得到信息,因此你无法追溯它进行调试。

我建议不要使用标准异常,而是使用boost exceptions,因为它们可以提供引发异常的上下文。

于 2012-12-05T09:41:49.777 回答
0

更基本的问题是:为什么首先使用异常?如果它是非异常行为(如果可以预期文件可能不存在),则根本不应该抛出异常。相反,控制应该沿着“官方路径”流动。

于 2018-04-27T12:57:27.820 回答
0

附加组件:在引用的书籍部分的意义上它并不干净(因为没有提供定位问题所需的上下文 - 正如其他人提到的那样),而且还因为:

  1. 自定义异常用于操作控制流。

所以而不是:

   throw FileNotFound("");
 }
 catch(const FileNotFound &e)
 {

只做:

    cout << "FileNotFound" << e.what(); 
  1. 变量名“e”并不是真正的自我解释,也不应该重复。

  2. 异常类应该有自己的文件。

  3. 您不应该互换使用错误和异常(在您的问题中)。这是一个额外的小费恕我直言。

于 2019-07-10T12:32:33.683 回答