5

我正在玩 AngelScript,我似乎无法理解的一件事是如何捕获从 C++ 抛出但从 AngelScript 调用的异常。这是我到目前为止所得到的:

// test.as

void main()
{
    print("Calling throwSomething...");

    throwSomething();

    print("Call finished");
}

void print(string)并且void throwSomething()是注册到引擎的两个函数,来源如下。根据AngelScript 文档

使用脚本引擎注册的应用程序函数和类方法允许抛出 C++ 异常。虚拟机将自动捕获任何 C++ 异常,中止脚本执行,并将控制权返回给应用程序。

下面是为处理异常提供的示例代码:

asIScriptContext *ctx = engine->CreateContext();
ctx->Prepare(engine->GetModule("test")->GetFunctionByName("func"));
int r = ctx->Execute();
if( r == asEXECUTION_EXCEPTION )
{
  string err = ctx->GetExceptionString();
  if( err == "Caught an exception from the application" )
  {
    // An application function threw an exception while being invoked from the script
    ...
  }
}

我几乎一字不差地将这段代码复制到我的编辑器中并尝试运行它。不幸的是,即使我将调用包装Execute在一个 try-catch 块中,我仍然得到这个输出:

(AngelScript) Calling throwSomething...
(C++) throwSomething Entered...
libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: Assert(1 == 0) failed, line 68
Abort trap: 6

为了完整起见,这里是throwSomethingand的代码print

void throwSomething()
{
    cout << "(C++) throwSomething Entered...\n";
    Assert(1 == 0); // will throw an exception
    cout << "(C++) throwSomething Exiting...\n";
}

void print(string s)
{
    cout << "(AngelScript) " << s << "\n";
}

所以,我感觉有点卡住了。我尝试注册一个异常翻译功能(请参阅链接文档),希望能有所帮助,但我仍然得到相同的结果。通过查看 Xcode 的调试器,异常似乎发生在主线程中——所以我不确定为什么我的代码或 AngelScript 库中的代码本身都没有捕获到异常。

所以,我想我的问题是:1)我怎样才能在我的程序中捕获异常,或者 2)如果我不能从程序中捕获它,我怎么能在程序不崩溃的情况下处理它?

我在运行 MacOS 10.14.6 和 AngelScript 版本 2.33.0 的 ~2015 MacBook Pro 上运行它,如果相关的话。

4

0 回答 0