我正在玩 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
为了完整起见,这里是throwSomething
and的代码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 上运行它,如果相关的话。