在下面提到的代码中,当我使用
float
参数调用“方法”时,它会自动转换为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"; }
问问题
2675 次
3 回答
2
请不要使用这样的例外。异常是针对特殊情况,而不是正常的程序逻辑。每次滥用异常时,$DEITY 都会杀死一只小猫。通过throw
ing 它。入坑。火的。和悲伤。
话虽如此:
- 隐式转换不适用于异常。请参阅:您可以通过转换运算符的类型捕获异常吗?
- 未捕获的异常将终止您的程序。所以重新抛出它会导致调用
terminate()
,并且你的程序已经死了。
于 2013-01-30T07:36:12.237 回答
2
函数调用在编译时解析,编译器能够检查类型,找到最接近的匹配(重载解析),然后进行适当的转换。当传播异常时,运行时不会发生此类事情。异常被catch
与类型完全匹配的 a 或异常的明确基数之一捕获。在你的情况下int
根本不匹配 a double
。
与您的第二个问题一样:您rethrow
没有被块包围try
,因此它不会被 last 捕获catch(...)
。最后一个catch(...)
对应于第一个try
块。
于 2013-01-30T07:36:23.760 回答
1
在几种情况下,简单变量可以转换为其他简单类型。其中之一是如果需要这样的转换来调用方法。这就是您的案例 1 中发生的情况——它发生在编译期间,调用在运行时未解决。如果要禁止此类行为,请使用explicit
关键字
但是,如果有两种方法具有不同类型的参数,则将选择参数与您传递的参数“最接近”的方法。类型转换不适用于 throw。只有当抛出的类型与 catch 参数中的类型匹配时,它才会匹配。因此默认捕获工作。
顺便说一句:您实际上使用的是双精度值,而不是浮点数!2.2f 将是一个浮点数
于 2013-01-30T07:39:41.300 回答