在查看一些代码时,我偶然发现:
throw /*-->*/new std::exception ("//...我一直认为你不需要/你不应该在这里使用new。
正确的方法是什么,两者都可以吗,如果是这样,有什么区别吗?
顺便说一句,我在用PowerShell boost库“贪婪”的时候从来不使用throw new。
另外,我还发现了一些使用throw gcnew的命令行界面代码。这样可以吗?
发布于 2012-06-10 04:44:23
抛出和捕获异常的传统方法是抛出一个异常对象,然后通过引用(通常是const引用)来捕获它。C++语言要求编译器生成适当的代码来构造异常对象,并在适当的时候适当地清除它。
抛出一个指向动态分配对象的指针从来都不是一个好主意。异常应该使您能够在面对错误情况时编写更健壮的代码。如果您以常规方式抛出异常对象,则可以确保无论它是否被命名为正确类型的catch子句捕获,是否被catch (...)捕获,无论它随后是否被重新抛出,它都将在适当的时间被正确地销毁。(唯一的例外是它永远不会被捕获,但无论从哪种角度来看,这都是一种不可恢复的情况。)
如果抛出一个指向动态分配对象的指针,则必须确保无论调用堆栈是什么样子,在要抛出异常的地方都有一个catch块,它命名了正确的指针类型并具有适当的delete调用。您的异常绝不能被catch (...)捕获,除非该块重新抛出异常,然后被另一个能够正确处理该异常的catch块捕获。
实际上,这意味着您已经使用了异常处理功能,该功能可以使编写健壮的代码变得更容易,并且使编写在所有情况下都正确的代码变得非常困难。这就抛开了一个问题,那就是它几乎不可能作为客户端代码的库代码,而这些客户端代码并不需要这个特性。
发布于 2012-06-08 19:53:54
抛出异常时不需要使用new。
只需写下:
throw yourexception(yourmessage);并捕获为:
catch(yourexception const & e)
{
//your code (probably logging related code)
}请注意,yourexception应该直接或间接地从std::exception派生。
发布于 2012-06-08 19:58:52
如果调用站点期望捕获std::exception*,则抛出new std::exception是正确的。但是没有人会期望捕捉到指向异常的指针。即使您记录了您的函数所做的事情,并且人们阅读了文档,他们仍然很容易忘记并尝试捕获对std::exception对象的引用。
https://stackoverflow.com/questions/10948316
复制相似问题