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

时间:2011-10-29 09:38:39

标签: c++ exception exception-handling

我有一个类 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 ,该成员未初始化。
无论如何,谢谢你的帮助。

3 个答案:

答案 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))?如果抛出与规范不匹配的异常,它们将中止程序。

我重复以前使用调试器逐步执行代码的建议。