gpt4 book ai didi

c++ - 从嵌套函数捕获异常不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:19 24 4
gpt4 key购买 nike

我有一个 cnMeshHelper 类,其方法 cnMeshHelper::initialize 调用各种可能抛出 cnZeroDivisionException 的函数。
精简后的代码如下所示:

cnVector cnVector::getNormalized() {
if (getLength() == 0.0) {
#ifdef DEBUG
printf("Throwing exception in cnVector::getNormalized().\n");
#endif // DEBUG
throw cnZeroDivisionException();
}
// ...
}

cnMatrix cnMatrix::getNormalized() {
return cnMatrix(
T.getNormalized(),
B.getNormalized(),
N.getNormalized(),
M.getNormalized() );
}

cnMatrix cnComputeTangentSpace( /* ... */ ) {
cnMatrix mat;
// ...
mat.T = mat.T.getNormalized()
return mat;
}

void cnMeshHelper::initialize(cnMesh& mesh) {
// ...
polygonMatrix = cnComputeTangentSpace( /* ... */ );
}

int main() {
cnMesh* mesh = new cnMesh( /* ... */ );
// ...
try {
cnMeshHelper helper;
helper.initialize(*mesh);
}
catch(cnZeroDivisionException& e) {
cout << "Zero division exceptione caught.\n";
}
}

现在,在某些情况下,cnMesh* mesh 可能会发生无效值,导致在 cnVector::getNormalized() 中抛出异常.
但问题是,如果是这种情况,try-catch 子句并没有捕获异常。程序在上述方法中打印 DEBUG 文本后终止。

更新:请注意,我可以在 cnMeshHelper::initialize() 中捕获异常,但“外部”的一切都不起作用。
即使使用 catch(...)在主体中工作。

你能告诉我为什么没有捕获异常吗?

知道了!

问题经常发生在其他地方。所以在这种情况下也是如此。
cnMeshHelper 析构函数因成员未初始化而抛出空指针。由于 cnMeshHelper::initialize 中的 cnZeroDivisionException,该成员未初始化。
无论如何,谢谢你的帮助。

最佳答案

部分

catch(cnZeroDivisionException& e) {

将捕获恰好一种异常。但是,如果有另一个异常或非异常中止(取消引用 NULL,...)会发生什么?

所以请将 printf 移到 if 部分,看看是否真的抛出了正确类型的异常。

我的 Crystal 球猜测是 getLength 会揭示一些不好的东西,因为你写了

...it can happen that the cnMesh* mesh has invalid values...

这些无效值也可能以某种方式影响 getLength。 (空指针、未初始化的内存、其他异常、...)

关于c++ - 从嵌套函数捕获异常不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7938093/

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