【问题标题】:Catching expection from nested function doesn't work从嵌套函数中捕获异常不起作用
【发布时间】: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


【解决方案1】:

部分

catch(cnZeroDivisionException& e) {

将准确捕获一种异常。但是如果有另一个异常或非异常中止(取消引用 NULL,...)会发生什么?

所以请将printf 移入 if 部分,看看是否真的抛出了正确类型的异常。

我的水晶球猜测是getLength 会暴露出你写的不好的东西

...cnMesh* 网格可能具有无效值...

这些无效值也可能以某种方式影响getLength。 (空指针、未初始化的内存、其他异常……)

【讨论】:

  • 对不起,我也应该将此添加到问题中。在 cnMeshHelper::initalize 中捕获 ZeroDivisionException 有效,而外部的一切都没有。我已经将printf 移到 if 语句中,这是我在写问题时遇到的问题
【解决方案2】:

知道了!

这种情况经常发生,问题出在其他地方。所以在这种情况下也是如此。 cnMeshHelper 析构函数由于未初始化的成员而抛出空指针。由于 cnMeshHelper::initialize 中的 cnZeroDivisionException,该成员未初始化。 无论如何,谢谢你的帮助。

【讨论】:

    【解决方案3】:

    涉及的任何函数是否有异常规范 (void fn() throw(some_exception))?如果抛出不符合规范的异常,它们将中止程序。

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

    【讨论】:

    • 我应该在哪里添加..() throw(some_exception) .. ?只有抛出的方法或任何可能调用抛出方法的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2011-02-26
    • 2011-11-27
    • 1970-01-01
    相关资源
    最近更新 更多