为什么我们通常跳过c++;新项目 我见过几个高级程序员写的C++项目,没有任何异常处理。

为什么我们通常跳过c++;新项目 我见过几个高级程序员写的C++项目,没有任何异常处理。,c++,exception-handling,C++,Exception Handling,例:我明白了:className*ptr=newclassname() 而不是: try { className* ptr = new className(); //some code/throug exception } catch(bad_alloc ba) //or catch some other exception { //some code } 通常情况下,即使我们知道有可能出现异常,人们也会离开这个“尝试-抓住”区块 还有一件事,当我

例:我明白了:
className*ptr=newclassname()

而不是:

 try
 {
     className* ptr = new className();
     //some code/throug exception 
 }
 catch(bad_alloc ba) //or catch some other exception 
 {
     //some code
 }
通常情况下,即使我们知道有可能出现异常,人们也会离开这个“尝试-抓住”区块

还有一件事,当我们使用
new
时,是否应该使用这种try/catch格式

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


提前谢谢

在我看来,这在很大程度上取决于您可能想要检查或删除某些内容的实际情况

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

如果只显示弹出窗口并关闭程序,则不必捕获异常。事实上,微软甚至不想让你捕获那些你不能正常处理的异常,所以它们被Windows自己的错误处理例程捕获(如果你有一些合作伙伴关系,这也可能为你作为开发人员提供迷你转储之类的东西;但从来没有仔细研究过这一点,)

我想最终归结起来是:

  • 如果您有某种恢复方法,那么使用异常块。在有意义的地方就地使用

  • 如果没有,请尝试在一个位置处理错误。这也是例外最擅长的。如果您在本地处理它,只需显示一个弹出窗口,然后杀死程序,就不必首先使用异常(这也可能意味着更快的代码)


在我看来,这在很大程度上取决于您可能想要检查或删除某些内容的实际情况

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

如果只显示弹出窗口并关闭程序,则不必捕获异常。事实上,微软甚至不想让你捕获那些你不能正常处理的异常,所以它们被Windows自己的错误处理例程捕获(如果你有一些合作伙伴关系,这也可能为你作为开发人员提供迷你转储之类的东西;但从来没有仔细研究过这一点,)

我想最终归结起来是:

  • 如果您有某种恢复方法,那么使用异常块。在有意义的地方就地使用

  • 如果没有,请尝试在一个位置处理错误。这也是例外最擅长的。如果您在本地处理它,只需显示一个弹出窗口,然后杀死程序,就不必首先使用异常(这也可能意味着更快的代码)


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;
}
试试看
{
图像处理器img(资源);
img.startargeProcessingRoutine();//可能一些更深层次的代码函数会抛出错误的\u alloc
}
捕获(标准::错误分配和e)
{

std::cerrstd::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;
}
试试看
{
图像处理器img(资源);
img.startargeProcessingRoutine();//可能一些更深层次的代码函数会抛出错误的\u alloc
}
捕获(标准::错误分配和e)
{
std::cerr在C#、Java、Python和许多其他语言中,通常需要使用
try
-
catch
(或该语言的等效语言)为了能够在发生异常时正确清理。例如,释放已分配的资源。上述三种语言现在都支持一种简化形式,即C#中的
使用
,Python中的
使用
,以及Java中的部分
try
(IIRC),但这只是语法糖化

相反,在C++中,对象异常析构函数在异常通过时被自动调用,并且处理清理事务。这通常被称为<强> RAII<强>,这是误导性的。资源获取是初始化的缩写。它基于确定性的、有保证的析构函数调用,这在Java和C#中是没有的

<> P> >在C++中,只需要一个代码>尝试< /COD> >代码> catch >代码>,在那里你要报告、重试或禁止。或者,将一个异常转换成其他异常或失败报告方案。

< P>在C语言中,使用java代码,Python和许多其他语言,通常需要使用<代码>尝试< /COD> >代码> catch <代码>(或语言的等价)为了能够在发生异常时正确清理。例如,释放已分配的资源。上述三种语言现在都支持一种简化形式,即C#中的
使用
,Python中的
使用
,以及Java中的部分
try
(IIRC),但这只是语法糖化

相反,在C++中,对象异常析构函数在异常通过时被自动调用,并且处理清理事务。这通常被称为<强> RAII<强>,这是误导性的。资源获取是初始化的缩写。它基于确定性的、有保证的析构函数调用,这在Java和C#中是没有的


在C++中,只需要一个代码>尝试< /COD> >代码> catch >代码>,在那里你要报告、重试或禁止。或者,将一个异常转换为其他异常或失败报告方案。< / P >微软似乎建议异常处理……可能相关:如果你得到一个BADYOLL,你会怎么做?在99%的情况下你都可以。do是优雅地退出,可以通过
main()
中的一个catch(甚至是no)来完成