首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛出新的std::exception vs抛出std::exception

抛出新的std::exception vs抛出std::exception
EN

Stack Overflow用户
提问于 2012-06-08 19:51:59
回答 5查看 60.7K关注 0票数 126

在查看一些代码时,我偶然发现:

代码语言:javascript
复制
throw /*-->*/new std::exception ("//...

我一直认为你不需要/你不应该在这里使用new

正确的方法是什么,两者都可以吗,如果是这样,有什么区别吗?

顺便说一句,我在用PowerShell boost库“贪婪”的时候从来不使用throw new

另外,我还发现了一些使用throw gcnew的命令行界面代码。这样可以吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-06-10 04:44:23

抛出和捕获异常的传统方法是抛出一个异常对象,然后通过引用(通常是const引用)来捕获它。C++语言要求编译器生成适当的代码来构造异常对象,并在适当的时候适当地清除它。

抛出一个指向动态分配对象的指针从来都不是一个好主意。异常应该使您能够在面对错误情况时编写更健壮的代码。如果您以常规方式抛出异常对象,则可以确保无论它是否被命名为正确类型的catch子句捕获,是否被catch (...)捕获,无论它随后是否被重新抛出,它都将在适当的时间被正确地销毁。(唯一的例外是它永远不会被捕获,但无论从哪种角度来看,这都是一种不可恢复的情况。)

如果抛出一个指向动态分配对象的指针,则必须确保无论调用堆栈是什么样子,在要抛出异常的地方都有一个catch块,它命名了正确的指针类型并具有适当的delete调用。您的异常绝不能被catch (...)捕获,除非该块重新抛出异常,然后被另一个能够正确处理该异常的catch块捕获。

实际上,这意味着您已经使用了异常处理功能,该功能可以使编写健壮的代码变得更容易,并且使编写在所有情况下都正确的代码变得非常困难。这就抛开了一个问题,那就是它几乎不可能作为客户端代码的库代码,而这些客户端代码并不需要这个特性。

票数 98
EN

Stack Overflow用户

发布于 2012-06-08 19:53:54

抛出异常时不需要使用new

只需写下:

代码语言:javascript
复制
throw yourexception(yourmessage);

并捕获为:

代码语言:javascript
复制
catch(yourexception const & e)
{
      //your code (probably logging related code)
}

请注意,yourexception应该直接或间接地从std::exception派生。

票数 34
EN

Stack Overflow用户

发布于 2012-06-08 19:58:52

如果调用站点期望捕获std::exception*,则抛出new std::exception是正确的。但是没有人会期望捕捉到指向异常的指针。即使您记录了您的函数所做的事情,并且人们阅读了文档,他们仍然很容易忘记并尝试捕获对std::exception对象的引用。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10948316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档