Как обработчик ошибок работает внутри? - PullRequest
2 голосов
/ 26 февраля 2012

Я знаю, что в Интернете должно быть достаточно документации по этой теме.Но проводить исследования часами без правильного ответа довольно сложно.Поэтому я предполагаю, что не могу сформулировать свой вопрос в хорошей фразе.Итак, полная версия:

Я делаю презентацию о try-catch, но довольно скучно делать основные вещи.Я знаю, что такое try catch, и знаю, как это работает.Но тут приходит волшебство: допустим, я использую C ++.

Компилятор создаст список «только для чтения» в куче со структурами, которые предоставляют информацию о функциях в блоке try.Это включает в себя указатели на начало и конец процедуры, информацию о типе объекта исключения и так далее.(Пожалуйста, поправьте меня, если я ошибаюсь)

Хорошо.Теперь происходит исключение.Так называемый обработчик ошибок (в данном случае, кто такой обработчик ошибок?) Будет искать все данные об отказавшей подпрограмме и получать соответствующую подпрограмму перехвата.Правильный улов определяется путем сравнения объекта исключения, сгенерированного в результате ошибки, с объектами исключения в улове.

Например: InvalidCastException (или что-то в этом роде) создано.Для этого есть ловушка, ошибка обрабатывается, и все объекты, созданные в блоке try, уничтожаются.

Но: Как программа может заметить, что существует исключение?Это обрабатывается программой, средой выполнения или, может быть, даже процессором (я читал кое-что о Ring0 и Ring1, разных уровнях в CPU oO).

1 Ответ

1 голос
/ 26 февраля 2012

Существует два способа реализации обработки исключений в C ++. Во-первых, это использовать обработку исключений Itanium ABI с нулевой стоимостью. Второй - использовать пару setjmp/longjmp для обработки потока управления для исключений. Первый - предпочтительная реализация для каждого современного компилятора.

Программа не "прослушивает" исключения, поэтому не замечает исключения. Вместо этого он создает и обрабатывает их как часть потока управления. Например, «throw» всегда вызывает исключение, которое запускает передачу выполнения в код обработки исключений.

Несмотря на то, что эти исключения интенсивно используются в C ++, который предоставляет хороший интерфейс для их «выброса» и «перехвата», они также используются в C и даже в ядре Linux.

Вы можете прочитать больше здесь:

...