我见过几个由老年人编写的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格式?
当我们准确地进行异常处理时(这可能是一个愚蠢的问题,但我仍然需要一些想法,因为我对异常处理感到困惑)。
先谢谢。
答案 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)。
我认为最终归结为:
如果您有某种方法可以恢复,请使用异常块。在有意义的地方使用它。
如果不这样做,请尝试在一个位置处理错误。这也是例外很擅长的。如果你在本地处理它,只需显示一个弹出窗口然后终止该程序,你就不必使用异常开始(这也可能意味着更快的代码)。