我正在经历 $q = "SELECT * FROM `curriculum` "
. "INNER JOIN `subject` ON `curriculum`.`subject`=`subject`.`sub_id` "
. "LEFT JOIN `subject` ON `curriculum`.`cur_pr`=`subject`.`sub_id` "
. "WHERE `course`=:cid and `cur_year`=1";
。
在那里,提到如果我们从其签名指定一组预定义异常类型的函数抛出意外异常,则应该调用C++ FAQ 2nd Edition, FAQ 9.04- What is an exception specification?
。
但是我的程序捕获了意外的异常而不是unexpected()->terminate()->abort()
,为什么?
abort()
这里我得到的输出#include<iostream>
using namespace std;
class Type1{};
class Type2{};
class Type3{};
void func() throw(Type1, Type2)
{
throw Type3();
}
int main()
{
try{
func();
}
catch (Type1 &obj1)
{
cout << "Type1 is caught" << endl;
}
catch (Type2 &obj2)
{
cout << "Type2 is caught" << endl;
}
catch (Type3 &obj3)
{
cout << "Type3 is caught" << endl;
}
}
不应该出现。
IDE:VS2013
答案 0 :(得分:6)
正如Adriano Repetti所说,MSVC会忽略异常规范。但是有一些原因。
来自SO的other post解释说,异常规范解释了编译器不能将异常控制强制为编译时,并且必须生成代码才能在运行时控制它。这就是编译器(特别是MSVC)支持不足的原因。
它引用了GOTW的一篇非常详细的文章,结论是:
所以这就是我们社区今天所学到的最佳建议:
答案 1 :(得分:4)
来自MSDN:
解析了throw()以外的函数异常说明符但未使用。这不符合ISO C ++规范的第15.4节
Visual C ++根本不遵循标准(引自Mohit's answer中的标准)。
编辑:关于子问题“为什么不呢?”我试着从评论中总结一下所说的内容。
答案 2 :(得分:1)