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

3 回答 3

2

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


话虽如此:

于 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 回答