#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
是清洁代码(Robert Martin)吗? std :: exception不提供“错误的位置”。 清洁代码敏捷软件工艺手册(Robert Martin) - &gt;第7章:错误处理 - &gt;提供具有例外的上下文
答案 0 :(得分:3)
考虑到引用的段落,它肯定不干净,因为您只是获取所发生事件的信息,但是您没有从抛出异常的位置获取信息,因此您无法追溯它以进行调试。
我建议使用boost exceptions而不是使用标准异常,因为它们可以提供抛出异常的上下文。
答案 1 :(得分:0)
更基本的问题是:为什么首先使用例外?如果它是非异常行为(如果可以预期文件可能不存在),则应该抛出任何异常。相反,控制应沿着“官方路径”流动。
答案 2 :(得分:0)
附加组件:从引用的书本部分来讲,这并不干净(因为没有提供定位问题的上下文,就像其他人提到的那样),但这也是因为:
所以不是:
throw FileNotFound(""); } catch(const FileNotFound &e) {
只能执行:
cout << "FileNotFound" << e.what();
变量名'e'不能真正说明问题,也不应重复。
异常类应该具有自己的文件。
您不应互换使用错误和异常(在您的问题中)。这是额外的小费恕我直言。