从其他线程中,我知道我们不应该在析构函数中抛出异常!但在下面的例子中,它确实有效。这是否意味着我们只能在一个实例的析构函数中抛出异常?我们应该如何理解这个代码示例!
#include <iostream>
using namespace std;
class A {
public:
~A() {
try {
printf("exception in A start\n");
throw 30;
printf("exception in A end\n");
}catch(int e
我知道析构函数不应该不抛出异常。
我有以下代码:
~a()
{
cleanup();
}
// I do not expect exception being thrown in this function.
// If exception really happen, I know that it is something not recoverable.
void a::cleaup()
{
delete p;
}
在我的静态源代码分析中,它抱怨我将以这种方式调用清理函数:
~a()
{
try {
cleanup();
}
ca
当抛出异常时,是否可以防止执行析构函数?
基本上,我的构造函数目前被设置为将一些信息保存到文件中。然而,即使当我抛出一个错误时,当我假设php将停止和停止在一起时,也会发生这种情况。
示例:
<?php
class Test {
function __construct() {
echo "constructor";
}
function __destruct() {
echo "destructor";
}
function Hello() {
echo "
我有一个类,它使用RAII进行清理,以防出现问题。这意味着类包含一个标志,告诉它工作是否已经完成,如果在调用构造函数时没有设置这个标志,它将执行清理任务并生成日志消息。现在我希望这个类变得更聪明一些,也就是说,如果发生了错误,它应该找出错误,因为工作被放弃了(例如,抛出了异常并调用了析构函数),或者因为有人错过了使用这个类,并且从未真正完成工作。这意味着我必须在析构函数中找出异常是否处于活动状态。如果发现异常,我会生成一条日志消息,可能会打印异常的内容,然后重新抛出它。我猜是这样的。
Foo::~Foo () {
try { /* do not know what to put here
这个问题是基于Scott在他的书“更有效的C++”中提供的一个例子。请考虑以下课程:
// A class to represent the profile of a user in a dating site for animal lovers.
class AnimalLoverProfile
{
public:
AnimalLoverProfile(const string& name,
const string& profilePictureFileName = "",
我有一个类,它的ctor发出驱动程序调用,其dtor进行匹配的终止/释放驱动程序调用。那些电话可能会失败。问题很自然地出在dtor身上。
我很自然地意识到避免dtors中异常的普遍智慧,因为如果在堆栈展开时抛出异常,就会得到std::terminate。但是--如果可以的话,我宁愿“吞下”这样的错误而不去报告它们。那么,编写这样的代码是否合法/惯用:
~MyClass() noexcept(false) {
auto result = something_which_may_fail_but_wont_throw();
if (std::uncaught_exceptions(