【发布时间】:2015-11-15 16:11:13
【问题描述】:
我正在尝试调试使用 Emscripten 编译的 C++ 程序,该程序会引发异常,特别是 runtime_errors,它将字符串作为 what_arg 传递。但是,当他们抛出时,我只会在 Javascript 控制台中得到一个数字(指针值?)输出。传递给构造函数的字符串会更有帮助。
例如程序
#include <stdexcept>
int main()
{
throw std::runtime_error("I want to see this in the console");
return 0;
}
使用 Emscripten 1.35.0 64bit(在 Mac OS X 上)通过命令编译
em++ exception.cc -o exception.html
在浏览器中查看时,输出到控制台
Uncaught 5247024
如何在运行时查看 what_arg 参数是什么?
理想情况下,这将在 C++ 代码中没有 try-catch 块,因此我可以使用 DISABLE_EXCEPTION_CATCHING 标志。有多种方法可以使用Pointer_stringify 将 C 风格字符串的内存地址转换为 Javascript 字符串。也许作为异常传递的数字有类似的东西?
【问题讨论】:
-
我看不出将 C++ 转换为 JS 以执行浏览器的意义,但没关系。在任何情况下,您都会像这样在 C++ 中捕获异常:
try {...} catch (std::exception ex) { std::cout << ex.what( ); }。 -
@szczurcio 你能解释一下为什么看这个论点没有意义吗?
-
对不起,请详细说明,什么论据?如果您询问您传递给
std::runtime_error的构造函数的const char[]消息,这就是what( )将给您的。 -
啊抱歉...我误读了您的消息(或者我可能是您编辑了它?)。我以为它说“我看不出那个意思”,我把“那个”理解为想要看到
const char[]消息,而不是将 C++ 转换为 JS 以供浏览器执行。我将 C++ 转换为 JS 以执行浏览器的原因是存在必须在浏览器中运行的现有 C++ 代码库。是的,了解what。 -
最初它确实说“我看不出那个意思”,因为我指的是您已删除的评论,而该评论又是对我已删除的初始评论的回应;)。无论如何,afaik 没有办法捕获从
std::exception派生的异常并在没有 try-catch 块的情况下打印其what( )。您可以阅读有关std::set_terminate和std::set_unexpected的信息,但它们不会让您打印消息,因为并非每种类型的异常都必须有一个(在 C++ 中,任何类都可以作为异常抛出,与 Java 不同)。
标签: javascript c++ exception emscripten