C++ 如何在发生异常时运行代码

C++ 如何在发生异常时运行代码,c++,c#-4.0,exception-handling,try-catch,C++,C# 4.0,Exception Handling,Try Catch,我有这样一个代码: try { do_some_processing(); // Write Log to appropriate place. } catch { // add debug info to log // Write Log to appropriate place. processException(); } 正如您所看到的,我需要在有异常和没有异常时编写日志 我能在一个地方做什么?而不是复制两次 据我所知,finally是在异常处理之后而不是之前调用的。

我有这样一个代码:

try
{
   do_some_processing();
   // Write Log to appropriate place.
}
catch
{
 // add debug info to log
 // Write Log to appropriate place.
  processException();
}
正如您所看到的,我需要在有异常和没有异常时编写日志

我能在一个地方做什么?而不是复制两次


据我所知,finally是在异常处理之后而不是之前调用的。我说的对吗?

只需将其移出
try catch
块:

try
{
    do_some_processing();
}
catch
{
    // add debug info to log
    processException();
}

// Write Log to appropriate place.

只需将其移出
try catch
块:

try
{
    do_some_processing();
}
catch
{
    // add debug info to log
    processException();
}

// Write Log to appropriate place.
那么:

try{
  do_some_processing();
}catch{
  // add debug info to log
  processException();
}

// write log to appropriate place
那么:

try{
  do_some_processing();
}catch{
  // add debug info to log
  processException();
}

// write log to appropriate place
我会用成语

我会用成语


在C++中没有最后一个。你的日志“有例外”和“一切都好”将是不同的=你不重复自己。(或者我没有得到什么)在C++中没有最后的。你的日志“有例外”和“一切都好”将是不同的=你不重复自己。(或者我并没有得到什么)但若ProceException关闭应用程序,则不会写入任何日志!我错了吗?@mans,它在哪里抛出,为什么异常应该关闭程序?它是在do_some_处理中抛出的,它可能会关闭应用程序,因为ProcessException检测到问题无法恢复,需要关闭应用程序。ProcessExepAction的任务是查看异常,如果它是主要异常,并且可以进行快速恢复,则会将其传递给更高级别的异常处理,这可能会关闭应用程序。@mans这就是为什么应该使用RAII。看看niktoz的答案。但若ProceException关闭应用程序,则不会写入日志!我错了吗?@mans,它在哪里抛出,为什么异常应该关闭程序?它是在do_some_处理中抛出的,它可能会关闭应用程序,因为ProcessException检测到问题无法恢复,需要关闭应用程序。ProcessExepAction的任务是查看异常,如果它是主要异常,并且可以进行快速恢复,则会将其传递给更高级别的异常处理,这可能会关闭应用程序。@mans这就是为什么应该使用RAII。看看尼克托兹的答案,这是不对的。如果do_som_工作中出现异常,则永远不会调用logger.set_success,因此不会写入日志!我错了吗?伙计们,你错了。由于
logger
是在堆栈上分配的(而不是在堆上分配的,因为没有使用
new
关键字),因此无论您执行什么操作,
railogger
类的析构函数都将在函数离开其作用域后被调用(即使引发异常)。这就是RAII的精髓。请注意,
set\u success
仅通知
logger
它已成功。该函数不记录任何内容-析构函数处理它。这是不正确的。如果do_som_工作中出现异常,则永远不会调用logger.set_success,因此不会写入日志!我错了吗?伙计们,你错了。由于
logger
是在堆栈上分配的(而不是在堆上分配的,因为没有使用
new
关键字),因此无论您执行什么操作,
railogger
类的析构函数都将在函数离开其作用域后被调用(即使引发异常)。这就是RAII的精髓。请注意,
set\u success
仅通知
logger
它已成功。函数不记录任何内容-析构函数负责记录。