Emscripten:如何捕获 JS 异常?
Emscripten: How to catch JS exception?
Emscripten 'val.h' API 允许调用JS对象的方法,但是C++ try-catch不会捕获JS异常。考虑这个例子:
#include <emscripten.h>
#include <emscripten/val.h>
void test(){
string t = "some invalid json";
val v = val::object();
// This C++ try-catch doesn't catch JS exception
try {
v = val::global("JSON").call<val>("parse", t);
cout <<"ok" <<endl;
}
catch(...){
cout <<"failed" <<endl;
}
cout <<"ret" <<endl;
}
JS异常使'test'函数停止,没有ok
,没有failed
,没有ret
打印出来。如何捕获 JSON.parse
?
抛出的 JS 异常
此处有 1 个问题,但仍未解决:https://github.com/emscripten-core/emscripten/issues/11496
By default, exception catching is disabled in Emscripten.
您必须 enable it 使用 -fexceptions
参数。
Emscripten 似乎还不能在 C++ 中捕获 JS 异常。这是 work-around:
// extern_pre.js
function json_parse(str){
try{
return JSON.parse(str);
}
catch(E){
return null;
}
}
// app.cpp
...
val v = val::global("json_parse")(some_str);
构建:
emcc app.cpp -o app.js --bind --extern-pre-js extern_pre.js
Emscripten 'val.h' API 允许调用JS对象的方法,但是C++ try-catch不会捕获JS异常。考虑这个例子:
#include <emscripten.h>
#include <emscripten/val.h>
void test(){
string t = "some invalid json";
val v = val::object();
// This C++ try-catch doesn't catch JS exception
try {
v = val::global("JSON").call<val>("parse", t);
cout <<"ok" <<endl;
}
catch(...){
cout <<"failed" <<endl;
}
cout <<"ret" <<endl;
}
JS异常使'test'函数停止,没有ok
,没有failed
,没有ret
打印出来。如何捕获 JSON.parse
?
此处有 1 个问题,但仍未解决:https://github.com/emscripten-core/emscripten/issues/11496
By default, exception catching is disabled in Emscripten.
您必须 enable it 使用 -fexceptions
参数。
Emscripten 似乎还不能在 C++ 中捕获 JS 异常。这是 work-around:
// extern_pre.js
function json_parse(str){
try{
return JSON.parse(str);
}
catch(E){
return null;
}
}
// app.cpp
...
val v = val::global("json_parse")(some_str);
构建:
emcc app.cpp -o app.js --bind --extern-pre-js extern_pre.js