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

基于documentation

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