Javascript 传递给引发异常的构造函数的视图字符串
我试图调试一个用EcliScript编译的C++程序,它抛出异常,特别是将字符串传递为<代码> WHYARG ARG< /COD>。然而,当它们抛出时,我只在Javascript控制台中得到一个数字(指针值?)输出。传递给构造函数的字符串将更有帮助 例如,程序Javascript 传递给引发异常的构造函数的视图字符串,javascript,c++,exception,emscripten,Javascript,C++,Exception,Emscripten,我试图调试一个用EcliScript编译的C++程序,它抛出异常,特别是将字符串传递为 WHYARG ARG< /COD>。然而,当它们抛出时,我只在Javascript控制台中得到一个数字(指针值?)输出。传递给构造函数的字符串将更有帮助 例如,程序 #include <stdexcept> int main() { throw std::runtime_error("I want to see this in the console"); return 0; } 在浏
#include <stdexcept>
int main()
{
throw std::runtime_error("I want to see this in the console");
return 0;
}
在浏览器中查看时,输出到控制台
Uncaught 5247024
我如何在运行时看到what_arg
参数是什么
理想情况下,这将是在C++代码中没有尝试catch块,所以我可以使用标志。有几种方法可以使用将C样式字符串的内存地址转换为Javascript字符串。作为异常传递的数字可能有类似的情况?您需要
捕获它并手动打印what()
字符串
<>编辑:这必须在C++中用<代码>尝试<代码> >代码> catch <代码>块,类似于:
int main(int argc, char** argv)
{
try
{
throw std::runtime_error("I want to see this in the console");
}
catch (const std::runtime_error& error)
{
std::cout << error.what() << std::endl;
}
return 0;
}
int main(int argc,char**argv)
{
尝试
{
抛出std::runtime_错误(“我想在控制台中看到它”);
}
捕获(const std::runtime_error&error)
{
std::cout有一种使用的方法,它似乎是在抛出未处理的异常时调用的
- 获取onerror处理程序的第5个参数
- 如果不是数字,什么都不要做
- 将数字返回到C++世界中,使用一个函数,例如,
- 然后,该函数对数字执行
重新解释
,以获取指向运行时错误的指针
- 调用
what
处理runtime\u错误
并将结果字符串传递给cerr
一个C++程序,这个例子是
#include <stdexcept>
#include <iostream>
#include <emscripten.h>
extern "C" void EMSCRIPTEN_KEEPALIVE what_to_stderr(intptr_t pointer)
{
auto error = reinterpret_cast<std::runtime_error *>(pointer);
std::cerr << error->what() << "\n";
}
int main()
{
throw std::runtime_error("I want to see this in the console");
return 0;
}
并在一个简单的HTML页面中运行
<!doctype html>
<html>
<head>
<title>Exception test</title>
<script>
var Module = {};
window.onerror = function(message, url, line, column, e) {
if (typeof e != 'number') return;
var pointer = e;
Module.ccall('what_to_stderr', 'number', ['number'], [pointer]);
}
</script>
<script src="exception.js"></script>
</head>
<body>
</body>
</html>
异常测试
var模块={};
window.onerror=函数(消息、url、行、列、e){
if(typeof e!=“number”)返回;
var指针=e;
Module.ccall('what_to_stderr','number',['number'],[pointer]);
}
它似乎在Chrome 46中工作,而Firefox 41 .< /P>你能给出这个例子代码吗?这会在C++中被捕获吗?或者在JavaScript中?这将在C++中被捕获。然后你需要将信息发送到JS。我不知道将C++转换成JS用于浏览器执行的点,但是没关系。无论如何,你会得到Excel的。在C++中,类似于:<代码>尝试{…} catch(STD::Exchange EX){STD::CUTHSZCZURCIO,你能解释为什么看这个论点没有什么意义吗?对不起,请详细说明,什么论点?如果你问的是<代码> const char []
您要传递给std::runtime\u error
的构造函数的消息,这就是将要传递给您的内容()
。啊,对不起……我看错了您的消息(或者我可能是您编辑了它?)。我以为它说“我看不到这一点”,我把“那”理解为希望看到常量字符[]< /COM>消息,而不是将C++转换成浏览器执行的J.S。我之所以将C++转换成JS浏览器执行的原因是,有一个现有的C++代码库必须在浏览器中运行。是的,关于代码<什么>代码>,最初它说“我看不到这一点”。,因为我指的是您删除的注释,而您删除的注释又是作为对我删除的初始注释的响应而编写的;)。无论如何,恐怕无法捕获源自std::exception
的异常并打印它的what()没有一个TestCcatch块。您可以阅读关于“代码> STD::StIjava终止/<代码>和,但是那些不会简单地打印消息,因为不是每种类型的异常都必须有一个(C++中任何类都可以作为异常抛出,不像Java)。
em++ -std=c++11 exception.cc -o exception.js
<!doctype html>
<html>
<head>
<title>Exception test</title>
<script>
var Module = {};
window.onerror = function(message, url, line, column, e) {
if (typeof e != 'number') return;
var pointer = e;
Module.ccall('what_to_stderr', 'number', ['number'], [pointer]);
}
</script>
<script src="exception.js"></script>
</head>
<body>
</body>
</html>