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

标签 c++ exception

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

相关文章:

c++ - 多模态图像对齐问题

C++,继承与多态

c++ - SQL numeric(18,0) 数据类型对应的 C++ 数据类型是什么?

Java 'finally'异常抛出规则

Java 整数值超出指定范围的异常

c++ - noexcept 函数仍然可以调用在 C++17 中抛出的函数吗?

C++ 代码在 VS2010 中工作但在 2013 中不工作

java - 我可以在单个类文件中在 java 中定义多个自定义异常并通过方法调用它们吗?

java - 如何管理具有相同行为的渔获物

c++ - 应该急切地还是懒惰地评估 C++ 约束?