---
# System prepended metadata

title: 'Exception handling: сквозь мультивселенные интероперабельности'

---

## План доклада

- Контекст: что такое Tarantool, особенность рантайма в виде большого количества слоев Lua-C-Lua-..
- Какие сложности возникают при обработке ошибок на стыках этих слоев:
    - Неудобная обработка, неестественные для Lua конструкции
    - Развал Lua-рантайма из-за CPP-исключения, несмотря на наличие pcall.
- Интероперабельность исключений: решение всех наших проблем
- Исторический контекст исключений:
    - Как исключения реализовывали когда-то давно: SJLJ, связные списки контекстов, много накладных расходов
    - Как исключения реализуют сейчас:
        - Размотка стека
        - Personality routines, поиск подходящих catch-блоков
        - Повторный проход с деструкцией
        - Передача управления в landing pad для соответствующего catch
- Возможные сценарии выброса исключения и их особенности:
    - C++ exception в CPP-функции
    - Lua exception в CPP-функции
    - Lua exception в Lua-функции
    - С++ exception на трассе
        - Как восстанавливать состояние VM? Создаем дополнительные снапшоты, чтобы корректно выходить обратно в VM.

- Что необходимо сделать для интероперабельности?
    - personality routine для VM
        - Что можно и нельзя делать с foreign exceptions
        - Разберем personality routine для VM LuaJIT
    - perosnality routine для трасс
    - landing pad для трасс и сложности корректного выхода в VM:
        - расставляем дополнительные снапшоты
        - разберем пример из LuaJIT
    - Динамическое расширение информации о фреймах при компиляции трасс

- Что получается в результате
    - Общий результат: можем пробрасывать исключения между языками, примеры использования
    - Некоторые неприятные платформоспецифичные особенности, о которых стоит знать.
