【问题标题】:catch C++ exception from CHECK macros of google logging library从谷歌日志库的 CHECK 宏中捕获 C++ 异常
【发布时间】:2015-05-23 17:39:26
【问题描述】:

我正在使用一个库,该库利用谷歌日志库来记录错误并使用 CHECK 宏检查断言。在我的代码中,我想在 CHECK 条件失败时捕获异常(例如,当应用程序因为文件不存在而无法打开文件时),但即使使用 catch(...) 它也不会捕获任何东西并且程序崩溃不受控制。

有没有办法在 CHECK 宏失败时捕获异常?或者,如果不可能,是否有解决方法来处理这些情况?

【问题讨论】:

  • CHECK 是编译时还是运行时评估的宏?
  • 它是一个运行时评估的宏(如 ASSERT)
  • 你在使用谷歌代码来处理异常?!
  • @KerrekSB 不是我,我正在使用一个库,它使用谷歌日志库 (google-glog.googlecode.com/svn/trunk/doc/glog.html) 来检查条件。由于我必须在我的代码中使用该库,我想找到一种方法来处理这些 CHECK 失败。
  • 老问题,但我偶然发现了同样的问题。你找到答案了吗?

标签: c++ exception try-catch


【解决方案1】:

glog的official document中提到,可以使用

用户自定义失效函数

替换默认的 exit() 行为。

例子:

   void YourFailureFunction() {
     throw exception();
   }
   int main(int argc, char* argv[]) {
     google::InstallFailureFunction(&YourFailureFunction);
   }

但是,该函数是在析构函数中调用的,因此该行为可能不适合我们的需要。在我的情况下,该函数被调用了两次,我必须实现一些不那么漂亮的 hack 以防止异常被抛出两次。

bool alreadyThrown = false;
void YourFailureFunction() {
    if (!alreadyThrown)
    {
        alreadyThrown = true;
        throw exception();
    }
}

【讨论】:

  • 如果我想禁用“CHECK”抛出。除了使用“InstallFailureFunction”还有其他方法吗?
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2014-07-27
  • 2020-09-26
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多