类型转换和异常处理

时间:2013-01-30 07:29:44

标签: c++ exception-handling casting

  • 在下面提到的代码中,当我使用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";
    }
    

3 个答案:

答案 0 :(得分:2)

函数调用在编译时解析,编译器能够检查类型,找到最接近的匹配(重载决策),然后进行适当的转换。传播异常时,运行时不会发生此类事件。该异常由完全匹配类型的catch捕获,或者是异常的明确基础之一。在您的情况下,intdouble无关。

与您的第二个问题一样:rethrow未被try块包围,因此最后catch(...)没有捕获它。最后一个catch(...)对应于第一个try块。

答案 1 :(得分:1)

请不要使用这样的例外。例外情况是特殊情况,而不是正常的程序逻辑。每次例外被滥用时,$ DEITY都会杀死一只小猫。通过throw它。进了一个坑。火悲伤。


话虽如此:

答案 2 :(得分:1)

在几种情况下,简单变量可以转换为其他简单类型。其中之一是如果需要这样的转换来调用方法。这就是您的案例1中发生的事情 - 并且它在编译期间发生,调用在运行时期间未得到解决。如果您想禁止此类行为,请使用explicit keyword

但是,如果有两种方法具有不同类型的参数,则将选择哪个参数与您传递的参数“最接近”的方法。类型转换不适用于throw。只有抛出的类型与catch参数中的类型匹配时,它才会匹配。因此默认捕获工作。

BTW:你实际上是在使用双值,而不是浮点数! 2.2f将是一个浮动