Как реализованы блоки try/catch?
Если в блоке try
возникает исключение, как выполняется передача в блок catch
? Это не вопрос С#/Java/С++, мне просто интересно, как это работает внутри.
Ответы
Ответ 1
это не вопрос С#/java/С++. Как это работает внутри страны, как строка знает, чтобы перейти к инструкции catch.
Как это работает внутри, это в значительной степени представляет собой вопрос С#/java/С++ (потому что он будет реализован по-разному).
В Java блок try устанавливается в специальную таблицу (в файле класса). Когда JVM генерирует исключение, он смотрит на эту таблицу, чтобы увидеть, где следующий catch или finally block to go to.
Ответ 2
При возникновении исключения выполняется специальная команда (обычно называемая прерыванием). Это приводит к выполнению универсального обработчика ошибок, который выводит, который является последним установленным подходящим обработчиком исключений. Затем выполняется этот обработчик.
Ответ 3
Существует разница в том, как технически обрабатываются исключения из естественно скомпилированных языков, таких как С++ и языки, используя исполняемый байт-код на виртуальной машине, такой как Java или С#.
Компиляторы С++ обычно генерируют код, который протоколирует информацию, необходимую для обработки исключений во время выполнения. Специальная структура данных используется для запоминания входа/выхода блоков try и связанного обработчика исключений. Когда возникает исключение, генерируется прерывание, и управление передается ОС, которая, в свою очередь, проверяет стек вызовов и определяет, какой обработчик исключений вызывается.
Более подробная информация подробно описана в следующей статье Вишала Коххара:
Как компилятор С++ реализует обработку исключений
В Java или .NET нет необходимости в накладных расходах на поддержку информации об обработке исключений, так как среда выполнения может интроспектировать байтовый код, чтобы найти соответствующий обработчик исключений. Как следствие, только те исключения, которые действительно выбрасываются, вызывают накладные расходы.
Ответ 4
он должен работать во всех языках, как это:
if (error_occured xy while doing things in try){
call_catch_part(error xy)
}
Ответ 5
Это в основном синтаксический анализ языка.
Вы можете получить всю информацию по адресу Здесь
Ответ 6
вы можете сделать то же самое в C, хотя сама по себе обработка исключений не существует.
Там вы бы использовали setjmp/longjmp К сожалению, вы не получаете разворот стека и должны сами обрабатывать все nitty-gritty.