AngelScript函数中引发的捕获/处理异常

时间:2020-01-10 22:01:34

标签: c++ exception angelscript

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

// test.as

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

    throwSomething();

    print("Call finished");
}

void print(string)void throwSomething()是注册到引擎的两个函数,其来源如下。按照AngelScript docs

允许在脚本引擎中注册的应用程序函数和类方法引发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

出于完整性考虑,以下是throwSomethingprint的代码:

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上运行此程序。

0 个答案:

没有答案