类型转换和异常处理
Type Cast and Exception Handling
-
在下面提到的代码中,当我使用
float
参数调用"method"时,它会自动强制转换为int
并执行必要的任务。但是,如果我抛出float
类型并且直接catch
期望int
论点,它不起作用?为什么? -
另一件事,如果没有
float
catch
声明,那么它是否应该转到一般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"; }
函数调用在编译时解析,编译器能够检查类型,找到最接近的匹配项(重载解析),然后执行适当的转换。传播异常时,运行时不会发生此类情况。异常由与类型完全匹配的catch
或异常的明确基础之一捕获。在您的情况下int
根本不匹配double
.
与您的第二个问题一样:您的rethrow
没有被try
块包围,因此它不会被最后一个catch(...)
捕获。最后一个catch(...)
对应于第一个try
块。
请不要使用这样的例外。 例外情况是特殊情况,而不是正常的程序逻辑。 每次滥用例外时,$DEITY都会杀死一只小猫。 通过throw
它。 成坑。 的火。 还有悲伤。
话虽如此:
- 隐式转换不适用于异常。 请参阅:能否按转换运算符的类型捕获异常?
- 未捕获的异常将终止程序。 所以重新抛出它会导致调用
terminate()
,并且你的程序已经死了。
在几种情况下,简单变量可以转换为其他简单类型。其中之一是是否需要这样的转换来调用方法。这就是您的案例 1 中正在发生的事情 - 它在编译期间发生,调用在运行时未解析。如果要禁止此类行为,请使用explicit
关键字
但是,如果有两种方法具有不同类型的参数,则将选择参数与您传递的参数"最接近"的方法。类型转换不适用于抛出。仅当抛出的类型与 catch 参数中的类型匹配时,它才会匹配。因此,默认捕获有效。
顺便说一句:您实际上使用的是双精度值,而不是浮点数! 2.2f 将是浮点数
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 为什么隐式转换在异常处理中从派生到基?
- 异常处理期间的类型解析
- 类型铸造在C 和异常处理中
- 从C‘goto’错误处理范式到C++异常处理范式的转换
- 异常中的类型转换
- 将异常处理从 python 转换为 C++
- 将处理后的浮点值类型转换为 int 会降低实际值
- c++中的异常处理从来没有捕捉到基本类型的异常,总是导致分段错误
- 处理模棱两可的类型转换/转换的正确方法是什么?
- c++ -强制类型转换变量以及如何处理它们
- 异常处理和强制转换
- 类型转换和异常处理