gpt4 book ai didi

c++ - 为什么 try...catch 需要抛出 EXACT 类型

转载 作者:可可西里 更新时间:2023-11-01 17:35:46 26 4
gpt4 key购买 nike

我可以做到,没问题:

long lngval = 3L;
int i = lngval;

但如果我尝试这样做:

try {
throw 3L;
}

catch(int i) {
cout << "caught " << i << endl;
}

我得到一个未处理的异常。

这似乎不一致。这种情况下没有类型转换的原因是什么?

最佳答案

在第一种情况下,编译器可以准确地告诉您要做什么:将 long 转换为 int。在第二种情况下,编译器必须假设您可能有这样的构造:

try {
try {
throw 3L;
}
catch (int i) { /* P */ }
}
catch (long l) { /* Q */ }

这个想法是编译器永远不知道是否有一个 catch (long l) 潜伏在当前上下文之外,所以只选择第一个可能的转换是不安全的。

这也是为什么在抛出异常时通常使用类层次结构而不是像 intlong 这样的随机类型:这使得添加或多或少的规范变得容易以编译器可以确定您的意图的方式添加到您的异常处理程序(通过 is-a 关系)。

关于c++ - 为什么 try...catch 需要抛出 EXACT 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7570538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com