C++ 从嵌套函数捕获期望值不会';行不通

C++ 从嵌套函数捕获期望值不会';行不通,c++,exception,exception-handling,C++,Exception,Exception Handling,我有一个类cnMeshHelper,它的方法cnMeshHelper::initialize调用各种函数,这些函数可能引发cnZeroDivisionException。 精简后的代码如下所示: cnVector cnVector::getNormalized() { if (getLength() == 0.0) { #ifdef DEBUG printf("Throwing exception in cnVector::getNormalize

我有一个类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";
    }
}
cnVector cnVector::getNormalized(){
如果(getLength()==0.0){
#ifdef调试
printf(“在cnVector::getNormalized()中引发异常。\n”);
#endif//DEBUG
抛出异常();
}
// ...
}
cnMatrix cnMatrix::getNormalized(){
返回矩阵(
T.getNormalized(),
B.getNormalized(),
N.getNormalized(),
M.getNormalized());
}
cnMatrix cnComputeTangentSpace(/*…*/){
cnMatrix;
// ...
mat.T=mat.T.getNormalized()
返回垫;
}
void cnMeshHelper::初始化(cnMesh和mesh){
// ...
polygonMatrix=cnComputeTangentSpace(/*…*/);
}
int main(){
cnMesh*mesh=新的cnMesh(/*…*/);
// ...
试一试{
帮助者;
helper.initialize(*网格);
}
捕获(CNE和e){
不能

catch(cnZeroDivisionException& e) {
将只捕获一种异常。但如果存在另一种异常或非异常中止(取消引用NULL…),会发生什么情况

因此,请将
printf
移动到
if
部分,以查看是否确实引发了正确类型的异常

我的水晶球猜测
getLength
将揭示自您编写以来的一些糟糕情况

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


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

所涉及的函数是否有异常规范(
void fn()throw(some_exception)
)?如果抛出与规范不匹配的异常,他们将中止程序

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

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

在代码中执行printf并不意味着抛出异常。prinf之后有if运算符。您是否在调试器中签入了该异常是否抛出?@AlexFarber谢谢,这只是我在编写此问题时遇到的一个问题。更正了它。您不应该允许异常转义析构函数。请参阅is question:对不起,我也应该将此添加到问题中。在cnMeshHelper::Initialize中捕获ZeroDivisionException有效,外部的一切都无效。我已经将
printf
移动到if语句中,这是我在编写问题时的问题。我应该在哪里添加
。()抛出(一些异常)..
?仅抛出的方法或可能调用抛出方法的任何方法?