【问题标题】:catch(...) swallowing all other catches in xcode llvm 3.0catch(...) 吞下 xcode llvm 3.0 中的所有其他捕获
【发布时间】:2012-04-12 18:04:18
【问题描述】:

我正在尝试让 googletest 在我的 c++ 项目上运行,其中一部分涉及使用 EXPECT_THROW(statement, expected_exception);。我正在使用 XCode 并选择了“Apple LLVM Compiler 3.0”。所有这些都在 Snow Leopard 10.6.8、XCode 4.2 上。

我无法通过任何这些测试,即使使用显式虚拟案例EXPECT_THROW(throw std::runtime_error(), std::runtime_error);

自己将宏(从 gtest/internal/gtest-internal.h:1114 GTEST_TEST_THROW_)扩展为

    bool gtest_caught_expected = false;
    try {
        // GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);
        throw std::runtime_error("sigh");
    }
    // catch (expected_exception const&) {
    catch (std::runtime_error const& e){
        std::cout << "const ref caught" << std::endl;
        gtest_caught_expected = true;
    }
    // added by me to check it wasn't a const& issue
    catch (std::runtime_error e){
        std::cout << "type caught" << std::endl;
        gtest_caught_expected = true;
    }
    catch (...) {
        //gtest_msg.value =
        // "Expected: " #statement " throws an exception of type "
        //#expected_exception ".\n  Actual: it throws a different type.";
        //goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__);
        std::cout << "unknown caught" << std::endl;         
    }

然后使用catch catch 在gdb 中设置一个断点并单步执行,我可以看到catch(runtime_errors) 被跳过,catch(...) 正在执行。如果我注释掉 catch(...) 块,则执行正确的 catch(std::runtime_error const&amp; e) 语句。

将我的编译器设置为“LLVM GCC 4.2”可以解决问题,但我想以 clang++ 为目标。

我单独的 EXPECT_THROW 测试用例在命令行上使用 clang++ 手动编译时有效,所以我认为它一定是一些深奥的 xcode 或 llvm 设置?或者也许 LLVM 是如何将我的 runtime_error 变成其他类型的?我尝试了catch throw,但可以获得该上下文中的任何类型信息。

有没有人经历过这种情况或有什么想法?

编辑:

所以我还链接了 libprofile_rt.dylib,以及编译器标志 -fprofile-arcs -fprofile-coverage。删除编译器标志-fprofile-arcs 消除了该问题。烦人,因为它破坏了我的报道报告。

(与 librpofile_rt.a 链接有同样的问题)

当然,我不是唯一看到这一点的人,因为 LLVM 据说使用 googletest 作为他们的测试用例?!

不确定我是否应该将其发布为答案,或者是否有更博学的人会出现并提供真正的解决方案。

【问题讨论】:

  • 不是答案,但您通常应该通过非 const 引用而不是 const 引用或值来捕获。
  • 您可能想尝试更新版本的 clang;自 Apple LLVM 编译器 3.0 以来,对异常处理进行了一些重要的修复。
  • 是的,走自建道路很诱人,但不适合与团队整合,除非每个人都准备好这样做......

标签: c++ xcode unit-testing llvm clang++


【解决方案1】:

稍等片刻之后,似乎没有已知的解决方法,所以我将按上述方式发布我的答案。它可能会在 Xcode 4.3 中修复

所以我还链接了 libprofile_rt.dylib,以及编译器标志 -fprofile-arcs -fprofile-coverage。删除编译器标志 -fprofile-arcs 消除了该问题。烦人,因为它破坏了我的报道报告。

(与 librpofile_rt.a 链接有同样的问题)

当然,我不是唯一一个看到这个的人,因为 LLVM 据说使用 googletest 作为他们的测试用例?!

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多