【问题标题】:How to run code even when an exception happens即使发生异常,如何运行代码
【发布时间】:2014-01-08 10:33:00
【问题描述】:

我有这样的代码:

try
{
   do_some_processing();
   // Write Log to appropriate place.
}
catch
{
 // add debug info to log
 // Write Log to appropriate place.
  processException();
}

如你所见,当有异常和没有异常时,我需要写日志。

有什么方法可以在一个地方做吗?而不是复制两次?

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

【问题讨论】:

  • C++ 中没有 finally。
  • 您的“有例外”和“一切正常”的日志会有所不同 => 您不要重复自己。 (或者我没有得到什么)

标签: c++ c#-4.0 exception-handling try-catch


【解决方案1】:

我会使用RAII idiom

class RaiiLogger {
public:
    RaiiLogger() : exception_fired_(true) {}

    void set_success() {
        exception_fired_ = false;
    }

    ~RaiiLogger() {
        if (exception_fired_) {
            // log it
        } else {
            // log it
        }
    }
private:
    bool exception_fired_;
};

void do_work() {
    RaiiLogger logger;
    try {
        // do some work
        logger.set_success();
    } catch(...) {
        // handle exception
    }
}

int main() {
    // your code goes here
    do_work();
    return 0;
}

【讨论】:

  • 这是不正确的。如果 do_som_work 出现异常,则永远不会调用 logger.set_success,因此不会写入日志!我错了吗?
  • @mans 你错了。由于logger 是在堆栈上分配的(而不是堆上,因为没有使用new 关键字)无论你做什么,一旦函数离开其范围,RaiiLogger 类的析构函数将始终被调用(即使异常是抛出)。这就是RAII的精髓。注意set_success 只通知logger 它成功了。 该函数不记录任何内容 - 析构函数会处理它。
【解决方案2】:

只需将其移出try-catch 块:

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

// Write Log to appropriate place.

【讨论】:

  • 但是如果procesException关闭应用程序,则不会写入日志!我错了吗?
  • @mans,它在哪里抛出,为什么异常应该关闭程序?
  • 它在do_some_processing中抛出,它可能会关闭应用程序,因为ProcessException检测到问题不可恢复,需要关闭应用程序。 processExepction 的工作是查看异常,如果它是主要的并且可以快速恢复,它将把它传递给更高级别的异常处理,这可能会关闭应用程序。
  • @mans 这就是您应该使用 RAII 的原因。看看 niktoz 的回答。
【解决方案3】:

怎么样:

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

// write log to appropriate place

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2014-06-29
    • 2021-09-21
    • 2020-06-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多