Продолжаем перевод серии статей об обработки исключений в С++ [1 часть][1] [3 часть][2]
Наша поездка в удивительном путешествии изучения работы исключений еще далека от конца, нам еще предстоит изучить что-то называемое "call frame information", помогающая библиотеке Unwind делать разворачивание стэка, а так же что компилятор пишет в чем-то, называемом LSDA, в которой определяется, какие ошибки метод может обрабатывать. А так же мы уже узнали, что большинство магии происходит в персональной функции, которую мы пока еще не видели в действии. Давай те резюмируем, что мы уже знаем о пробросе и отлове ошибок (или, точнее, что мы уже знаем о том, как брошенное будет перехвачено):
* компилятор транслирует throw объявление в пару ****cxa\_allocate\_exception/**xca\_throw**
* **\_\_cxa\_allocate\_exception** создает исключение в памяти
* **\_\_cxa\_throw** запускает работу разворачивания и передает исключение в низко-уровневую библиотеку разворачивания, вызывая _\_Unwind\_RaiseException_
* Разворачивание стэка использует CFI, чтобы узнать, какая сейчас функция в стеке
* Каждая функция имеет LSDA, добавляя что-то, называемое **.gcc\_except\_table**
* Разворачивание вызывает персональную функцию с текущим фреймом стэка и LSDA, которая должна продолжить разворачивать стэк, если текущая функция не имеет обработчиков исключения данного типа.
[Читать дальше →][3]
[1]:
https://habrahabr.ru/post/279111/
[2]:
https://habrahabr.ru/post/279149/
[3]:
https://habrahabr.ru/post/279151/#habracut