我正在玩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
出于完整性考虑,以下是throwSomething
和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上运行此程序。