Отлов / обработка исключений, генерируемых в функциях AngelScript - PullRequest
5 голосов
/ 11 января 2020

Я играю с 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, если это уместно.

...