Dr.*_*ula 28 c++ exception-handling
我只是学习如何处理我的C++代码中的错误.我写了这个示例,查找一个名为some file的文本文件,如果找不到它将抛出异常.
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int array[90];
try
{
ifstream file;
file.open("somefile.txt");
if(!file.good())
throw 56;
}
catch(int e)
{
cout<<"Error number "<<e<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我有两个问题.首先,我想知道我是否正确使用了例外.第二,(假设第一个是真的)使用它们对If else语句有什么好处?
Jer*_*fin 23
"正确地"是一种价值判断,但是(与其他类不同),异常类是一个单一的层次结构有一个主要的好处,所以我通常建议抛出一些派生的东西std::exception
,而不仅仅是一个int.
其次,可以肯定的是,不正确的文件名是否足够意外,无法作为抛出异常的理由.
至于利益与if/else声明:有一对.首先,异常允许您隔离处理错误的代码,因此代码的主要思想和可读性不会在错误处理的迷宫中丢失.其次,当你在抛出和捕获异常之间有几层代码时,抛出异常的代码可能不知道应该如何处理它.例如,您的代码用于std::cout
报告问题 - 但大多数此类代码会报告错误std::cerr
.您可以从一个更改为另一个,而无需对尝试打开文件的代码进行任何更改(可能在库中很深,并且不知道哪个应该用于此应用程序 - 并且可能在应用程序中使用两者都错了,并且MessageBox
是首选).
首先,我想知道我是否正确使用了例外.
是的,但通常您希望您的异常派生自std :: exception.
第二,(假设第一个是真的)使用它们对If else语句有什么好处?
对于给定的例子,没有.当你拥有许多深层嵌套函数时,例外的好处就来了.
#include <stdexcept>
#include <iostream>
#include <string>
void anErrorFunc(const std::string& x)
{
ifstream file;
file.open(x);
if (!file)
throw std::runtime_error("Could not open file");
}
void someOtherFunction(const std::string& y)
{
//Do stuff
anErrorFunc(y);
//Do other stuff
}
int main()
{
try {
someOtherFunction("somefile.txt");
} catch (std::exception &ex) {
std::cout << "Ouch! That hurts, because: "
<< ex.what() << "!\n";
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,异常将被捕获main()
,并且someOtherFunction
不必担心处理传递失败返回代码.
好吧,您正确使用了异常,因为您的代码没有任何问题。也就是说,通常我们不会乱扔原始类型(尽管你可以)。通常,抛出一个派生自std::exception 的对象是一个更好的主意,甚至更好的是抛出一个也是boost::exception 的 std::exception。
当事情非常简单并且处理代码和抛出代码位于同一个函数中时,确实没有理由使用异常而不是 if 语句(事实上,使用 if 会更快、更有效)否则在该特定情况下)。然而,在大多数情况下,发现错误并需要报告错误的点与处理错误的逻辑相距甚远。在许多情况下,错误恢复逻辑特定于相关应用程序,并且发现错误的逻辑无法就如何从错误中恢复做出明智的选择,因此需要抛出错误。
异常处理的另一个好处是可以使用异常的类型来传达发生的错误的类型。通常,异常层次结构中的类型比最终在 C 代码中使用的错误代码更有意义。此外,您不能像忽略错误代码那样轻松地忽略异常;虽然你可以忽略异常,但它会导致程序惨死。相比之下,如果 C 函数返回错误状态代码,而您忽略它,则可能会继续执行并默默地得到错误结果……从这个意义上说,使用异常比使用错误代码安全得多。
您可能还有兴趣阅读C++ FAQ Lite 中有关异常和错误处理的内容。