c++ - 为什么在我的 c++ 代码中会抛出这个确切的异常?
问题描述
我正在分析我讲座中的部分代码。我设法编译它,但我不明白:为什么我的程序输出“Wyjatek”和 0 而不是“WyjatekNieoznaczony”?
我很确定 WyjatekNieoznaczony() 应该被抛出,因为 a=0 和 b=0 也是如此。现在我有点困惑。请问你能帮帮我吗?
class Wyjatek {};
class WyjatekBledny : public Wyjatek {};
class WyjatekNieoznaczony : public Wyjatek {};
double f(double a, double b) {
if (b == 0) {
if (a == 0)
throw WyjatekNieoznaczony();
else
throw WyjatekBledny();
}
return a / b;
}
double g(double a, double b) throw (int) {
try {
return f(a, b);
}
catch (WyjatekBledny) {
cout << "Wyjatek bledny" << endl;
throw 1;
}
catch (Wyjatek) {
cout << "Wyjatek" << endl;
}
catch (WyjatekNieoznaczony) {
cout << "Wyjatek nieoznaczony" << endl;
throw;
}
return 0;
}
int main()
{
double a = 0, b = 0;
try {
cout << g(a, b) << endl;
}
catch (...)
{
cout << "Inny wyjatek" << endl;
}
system("pause");
return 0;
}
解决方案
是的,确实 aWyjatekNieoznaczony
被抛出,但在捕获站点,catch (Wyjatek) {
是一个匹配项(由于继承),所以它被捕获在那里。
捕获站点更像是一个if
else
行为块——每种catch
可能性都按照它们的写入顺序进行考虑——而不是一个switch
你可以按照你喜欢的任何顺序放置标签的块。
另请注意,通过const
引用而不是通过值捕获异常是一个好主意,否则您可能会遭受对象切片的陷阱。
推荐阅读
- laravel - 使用 Laravel Homestead:“没有指定输入文件”
- javascript - 当另一个元素滚动到视口中时向按钮添加类
- r - R ggplot geom.tile函数中的手动bin大小选择?
- javascript - 创建一个 .change() 来替换 .click() 或类似的东西
- sql - 无法在 MS Access 查询中显示 0 或 Null
- ionic4 - 我正在尝试在我的 ionic4 页面中实现 ng-autocomplete
- reactjs - 如何防止组件渲染两次?
- github - 要使用 conda 激活存储库,出现此错误:“在注册表或 VS140COMNTOOLS env v 中找不到 VS”
- wordpress - 网站无法使用移动和隐身模式完全打开页面
- python - 修复格式错误的 xml 时出现内存错误