为什么我们通常会在c ++项目中跳过try catch block for new

时间:2014-12-31 07:44:39

标签: c++ exception-handling

我见过几个由老年人编写的c ++项目,没有任何异常处理。

前:我明白了:className* ptr = new className();

而不是:

 try
 {
     className* ptr = new className();
     //some code/throug exception 
 }
 catch(bad_alloc ba) //or catch some other exception 
 {
     //some code
 }

通常为什么即使我们知道有异常的可能性,人们也会离开这个try-catch块。

还有一件事,我们在使用new时是否应该使用此try / catch格式?

当我们准确地进行异常处理时(这可能是一个愚蠢的问题,但我仍然需要一些想法,因为我对异常处理感到困惑)。

先谢谢。

3 个答案:

答案 0 :(得分:2)

在C#,Java,Python和许多其他语言中,通常需要使用try - catch(或语言的等效语言)才能清理发生异常时正确。例如,释放已分配的资源。现在提到的所有三种语言都支持C#中的using,Python中的with和Java中try(IIRC)的部分简化形式,但这只是语法上的含糖。

相反,在C ++对象中,当异常通过时会自动调用析构函数,并且它们处理清理工作。这通常被称为 RAII ,其(误导性地)是资源获取初始化的缩写。它基于确定性的,保证的析构函数调用,这是Java和C#中没有的。

所以在C ++中只需要try - catch,你想报告重试压制。或者,异常转换为其他一些异常或失败报告方案。

答案 1 :(得分:1)

std :: bad_alloc异常理想地在main()或调用更大例程的代码片段中处理。通常,您无法以有用的方式处理小“子功能”中的分配失败。但是,例如,如果你写了类似的东西:

try
{
   ImageProcessor img(resource);
   img.startLargeProcessingRoutine(); // maybe some deeper code functions throw bad_alloc
}
catch(std::bad_alloc &e)
{
   std::cerr << "Not enough memory for processing this resource" << std::endl;
}

您可以在特定操作失败时做出正确的选择。

答案 2 :(得分:0)

IMO在很大程度上取决于您可能想要检查或省略某些内容的实际情况。

或换句话说:如果分配失败,是否有某种方式可以以优雅的方式恢复?

如果您只是显示弹出窗口并关闭程序,则不必捕获异常。事实上,微软甚至不希望你捕捉到你没有优雅处理的异常,所以它们被Windows自己的错误处理例程(如果你有一些也可能提供你作为开发人员的minidumps等)伙伴关系;从未仔细研究过这个问题,more information can be found here)。

我认为最终归结为:

  • 如果您有某种方法可以恢复,请使用异常块。在有意义的地方使用它。

  • 如果不这样做,请尝试在一个位置处理错误。这也是例外很擅长的。如果你在本地处理它,只需显示一个弹出窗口然后终止该程序,你就不必使用异常开始(这也可能意味着更快的代码)。