gpt4 book ai didi

c++ - 两种捕获异常的方法,哪种更可取?

转载 作者:搜寻专家 更新时间:2023-10-31 00:38:42 25 4
gpt4 key购买 nike

好的,有一个名为 doProcess() 的函数,我想捕获可能在该函数内部发生的异常。我很困惑,因为有时我注意到,如果我们试图在函数内部或外部捕获异常,会有一些不同。所以请告诉我有什么区别,哪种方法更可取?我在 Win 7 中使用 VS C++ 2010。谢谢。

在函数内部捕获..

void doProcess()
{
try{
for(int i=0; i<n; i++)
{
Performcalculations();
.
.
.
}
performanotherProcess();
.
.
}
catch(exception e) {
cout<<e.what()<<endl;
}

在回调函数中捕获外部。

void callback()
{
try{
doProcess();
}
catch(exception e) {
cout<<e.what()<<endl;
}
}

最佳答案

这取决于什么级别最能处理异常。视情况而定,您甚至可能希望在较低级别捕获它,执行一些异常处理操作,然后重新抛出它并在较高级别再次捕获它以在那里进一步处理它。

异常处理可能涉及在未抛出异常时不执行的特殊操作。示例包括:

  • 记录警告或错误消息
  • 清理资源
  • 修改参数并重新尝试运行失败的函数
  • 在重新抛出之前向异常对象添加信息

对于低级函数,并非所有这些操作都是可能的。例如,记录器可能在低级别不可用,或者某些需要清理的资源可能无法从那里访问。在这些情况下,您需要抛出(或捕获并重新抛出)异常并在更高级别捕获它。

这完全取决于哪个级别可以访问处理异常所需的资源。多次捕获并重新抛出,或者作为不同的异常类型捕获并重新抛出,也是完全可能的,有时也是正确的做法。


我还应该说,通过引用捕获异常通常是个好主意,而不是复制:

catch (my_exception &e)
{ /*...*/ }

原因包括:a) 你保存一个拷贝,b) 你受益于类型多态性(因为异常通常是异常类型的类型层次结构的一部分),c) 你可以以自然的方式调用成员函数原始异常对象和/或在它被捕获并重新抛出的每个级别上向它添加信息。如果您不添加信息,而只是简单地捕获(并可能重新抛出),也可以将其捕获为 const-reference。

关于c++ - 两种捕获异常的方法,哪种更可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com