我有一个类 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 ,该成员未初始化。
无论如何,谢谢你的帮助。
答案 0 :(得分:1)
部分
catch(cnZeroDivisionException& e) {
会抓住一种异常。但是如果有另一个异常或非异常中止(取消引用NULL,...)会发生什么?
因此,请将printf
移至 if
部分,看看是否真的抛出了正确类型的异常。
我的水晶球猜测是getLength
会在你写完
...... cnMesh *网格可能会出现无效值......
这些无效值也可能以某种方式影响getLength
。 (nullpointers,未初始化的内存,其他异常,......)
答案 1 :(得分:1)
经常发生,问题出在其他地方。所以在这种情况下也是如此。 由于未初始化的成员, cnMeshHelper 析构函数抛出了空指针。由于 cnMeshHelper :: initialize 中的 cnZeroDivisionException ,该成员未初始化。 无论如何,谢谢你的帮助。
答案 2 :(得分:0)
所涉及的任何函数是否都有异常规范(void fn() throw(some_exception)
)?如果抛出与规范不匹配的异常,它们将中止程序。
我重复以前使用调试器逐步执行代码的建议。