C++ 从嵌套函数捕获期望值不会';行不通
我有一个类cnMeshHelper,它的方法cnMeshHelper::initialize调用各种函数,这些函数可能引发cnZeroDivisionException。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
精简后的代码如下所示:
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语句中,这是我在编写问题时的问题。我应该在哪里添加。()抛出(一些异常)..
?仅抛出的方法或可能调用抛出方法的任何方法?