类型转换和异常处理

Type Cast and Exception Handling

本文关键字:异常处理 类型转换      更新时间:2023-10-16
  • 在下面提到的代码中,当我使用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 将是浮点数