我有一个 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/