C ++检索异常信息

时间:2010-01-12 16:27:52

标签: c++ exception try-catch extract-error-message

我有一个需要调试的c ++ dll。由于我使用dll的情况,我无法通过调用应用程序调试它。

所以,我创建了一个try -catch,catch将异常写入文件。

需要调试的行涉及来自第三方dll的导入类,因此我无法知道它是什么类型的异常。当我尝试catch(异常e)时,没有消息写入该文件。所以我尝试了catch(...),它确实触发了一些东西:

使用std :: exception :: what,写入文件的唯一内容是“1”。 使用std :: exception :: exception,该文件收到以下代码:“0579EF90”。

有没有办法让我检索有关抛出的异常的有意义的信息?

TIA

CG

5 个答案:

答案 0 :(得分:7)

如果您不使用catch(KnownExceptionType ex)并使用关于KnownExceptionType的knwoledge来提取信息,那么你不能。

当你遇到catch(...)时,你几乎迷失了,你知道你处理了一个异常,但那里没有类型信息,你几乎无能为力。

你是更糟糕的情况,来自库的异常,你没有关于异常的信息,即使你有lib的头,也不需要在那里定义异常类型。

答案 1 :(得分:3)

也许尝试捕捉std :: exception& ë

  1. std :: cout<< e.what()<< ENDL;
  2. 看看你是否可以将它转换为std :: logic_error和std :: runtime_error - 这应该可以为你提供一些线索

答案 2 :(得分:3)

如果我理解正确,您已经将问题的来源缩小到特定的第三方库调用,但是您不允许实时调试应用程序(我想问为什么?) ,你的问题是“如何在不知道异常是什么的情况下调试异常”

答案是,你做不到。正如你所观察到的,你可以盲目地猜测并希望抓住正确的东西。你也可以捕捉(......),但这不会告诉你什么。如果你可以实时调试,你可以设置调试器在抛出异常时中断,看看那里发生了什么。

我认为正确的答案是联系你已经缩小问题根源的第三方图书馆并向他们提问。提出异常是非常非常糟糕的形式允许它跨模块边界传播。它让我怀疑它是空指针deref之类的Windows SEH异常,并且你正在以catch(...)捕获它们的方式进行编译。

答案 3 :(得分:1)

首先,你应该始终通过const引用捕获异常,换句话说:

catch( const std::exception & ex ) {
  ...
}

不这样做意味着您的异常将是您捕获的确切类型,这可能会导致异常信息丢失。

但是,你的库似乎正在抛出一些不是从std :: exception派生的东西 - 你需要找出类型(理想情况下是基类型)。

答案 4 :(得分:1)

我有点困惑。一方面你写catch(std::exception)不起作用(你应该使用catch(const std::exception&),BTW),另一方面你也写你调用std::exception::what()。如果你首先没有std::exception,你是怎么做到的?

无论如何,一旦你发现了...以外的任何东西,你可以尝试记录RTTI信息:

#include <typeinfo>

try {
  foreign_code(my_data);
} catch(const some_type& x) {
  std::cerr << "Yikes! Caught exception of type '" 
            << typeid(x).name() 
            << "' with its hand in the cookie jar!\n";
  std::abort();
}

虽然标准没有对std::type_info::name()的结果做出任何假设,但大多数(如果不是全部)编译器将生成发出至少在某种程度上有用的内容的代码。

当您进入VS调试器时,您也可以将其设置为在任何抛出异常时停止。这为您提供了堆栈跟踪,因此可能会为您提供有关传递给DLL的数据可能导致问题的线索。

相关问题