在下面提到的代码中,当我使用float
参数调用“method”时,它会自动转换为int
并执行必要的任务。但是,当我抛出float
类型并且立即catch
期望int
参数时,它不起作用?为什么?
另一件事,如果catch
没有float
声明,那么它应该转到普通catch
,如果我重新抛出catch
会处理吗?
int method(int i)
{
return i--;
}
void main()
{
try {
cout<<method(3.14);
throw string("4");
}
catch(string& s){
try{
cout << s;
throw 2.2;
}
catch(int i)
cout<<i;
catch(...)
throw;
cout<<"s"+s;
}
catch(...)
cout<<"all";
}
答案 0 :(得分:2)
函数调用在编译时解析,编译器能够检查类型,找到最接近的匹配(重载决策),然后进行适当的转换。传播异常时,运行时不会发生此类事件。该异常由完全匹配类型的catch
捕获,或者是异常的明确基础之一。在您的情况下,int
与double
无关。
与您的第二个问题一样:rethrow
未被try
块包围,因此最后catch(...)
没有捕获它。最后一个catch(...)
对应于第一个try
块。
答案 1 :(得分:1)
请不要使用这样的例外。例外情况是特殊情况,而不是正常的程序逻辑。每次例外被滥用时,$ DEITY都会杀死一只小猫。通过throw
它。进了一个坑。火悲伤。
话虽如此:
terminate()
,而你的程序已经死了。答案 2 :(得分:1)
在几种情况下,简单变量可以转换为其他简单类型。其中之一是如果需要这样的转换来调用方法。这就是您的案例1中发生的事情 - 并且它在编译期间发生,调用在运行时期间未得到解决。如果您想禁止此类行为,请使用explicit
keyword
但是,如果有两种方法具有不同类型的参数,则将选择哪个参数与您传递的参数“最接近”的方法。类型转换不适用于throw。只有抛出的类型与catch参数中的类型匹配时,它才会匹配。因此默认捕获工作。
BTW:你实际上是在使用双值,而不是浮点数! 2.2f将是一个浮动