Я играю с 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
и 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";
}
Итак, я чувствую себя немного застрявшим. Я пытался зарегистрировать функцию преобразования исключений (см. Связанный do c) в надежде, что это поможет, но я все же получил те же результаты. Посмотрев на отладчик Xcode, исключение возникает в основном потоке - поэтому я не уверен, почему ни мой код, ни код в самой библиотеке AngelScript не перехватили исключение.
Итак, я думаю, мой вопрос является: 1) как я могу поймать исключение в моей программе, или 2) если я не могу поймать его изнутри программы, как я могу иначе обработать его без сбоя программы?
Я запуск этого на MacBook Pro ~ 2015 с MacOS 10.14.6 и AngelScript версии 2.33.0, если это уместно.