【发布时间】:2011-10-29 19:15:09
【问题描述】:
我有一个类 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-text 后就终止了。
更新:请注意,我可以在 cnMeshHelper::initialize() 中捕获异常,但“外部”的一切都不起作用。
即使使用catch(...) 也不主要工作。
你能告诉我为什么没有捕获到异常吗?
知道了!
这种情况经常发生,问题出在其他地方。所以在这种情况下也是如此。
cnMeshHelper 析构函数由于未初始化的成员而抛出空指针。由于 cnMeshHelper::initialize 中的 cnZeroDivisionException,该成员未初始化。
无论如何,谢谢你的帮助。
【问题讨论】:
-
在代码中执行 printf 并不意味着抛出异常。 prinf 后面有 if 运算符。
-
您是否在调试器中检查过是否抛出了异常?
-
@AlexFarber 谢谢,这只是我写这个问题时的一个问题。已更正。
-
你不应该让异常逃逸析构函数。看到这个问题:stackoverflow.com/questions/130117/…
标签: c++ exception exception-handling