apifunc()
и apifunc2()
переводят исключения в коды ошибок, используя функцию dispatcher()
.
По сути, происходит следующее: apifunc()
(и аналогично apifunc2()
) пытается вызватьфункция foo()
.Если foo()
выдает исключение, то блок catch
вызовет dispatcher()
, чтобы получить код ошибки, соответствующий исключению, а затем вернет этот код ошибки.Если foo()
не выбрасывает, apifunc()
возвращает ErrorCode_Fine
, что указывает на отсутствие ошибки.
dispatcher()
работает путем повторного выброса последнего сгенерированного исключения, то есть одного foo()
сгенерированного.dispatcher()
затем проверяет, какое исключение было сгенерировано с использованием блоков catch
, и возвращает правильный код ошибки.Например, если foo()
бросил std::bad_alloc
, то этот блок catch будет выполнен и вернет ErrorCode_OutOfMemory;
.
Зачем кому-то это делать?
Исключения не обязательно являются двоично-совместимыми для разных компиляций (компиляторов, флагов компиляторов и т. Д.), Поэтому преобразование исключений в коды ошибок более переносимо через границы модулей.