Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 传递给引发异常的构造函数的视图字符串_Javascript_C++_Exception_Emscripten - Fatal编程技术网

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; } 在浏

我试图调试一个用EcliScript编译的C++程序,它抛出异常,特别是将字符串传递为<代码> WHYARG ARG< /COD>。然而,当它们抛出时,我只在Javascript控制台中得到一个数字(指针值?)输出。传递给构造函数的字符串将更有帮助

例如,程序

#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>