Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки.
Как исключение из вложенной функции ловится её вызывающей функцией ? что при этом происходит со стеком ?
Здравствуйте, riffmaster, Вы писали:
R>Здравствуйте!
R>Есть такие вопросы по исключениям в с++ :
R>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки. R>Как исключение из вложенной функции ловится её вызывающей функцией ? что при этом происходит со стеком ?
какой компилятор и операционная система? под виндой со студией одним образом в никсах и gcc другим... проще говоря сохраняется адрес catch, передается управление обработчику который находит нужный тип исключения и передается управление на нужный catch.
Здравствуйте, riffmaster, Вы писали:
R>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки. R>Как исключение из вложенной функции ловится её вызывающей функцией ? что при этом происходит со стеком ?
Как уже было сказано — раскрутка стека и пришибание объектов. Однако, что будет, если исключение стрельнет в Си-шном call-backе? Например, из функции сравнения qsort? Или из WindowProc? Я слыхал, в GCC должно работать нормально при определенных опциях. Но вообще-то, ничего не гарантировано — то есть UB.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, riffmaster, Вы писали:
R>Здравствуйте!
R>Есть такие вопросы по исключениям в с++ :
R>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки. R>Как исключение из вложенной функции ловится её вызывающей функцией ? что при этом происходит со стеком ?
Здравствуйте, coba, Вы писали:
C>Здравствуйте, riffmaster, Вы писали:
R>>Здравствуйте!
R>>Есть такие вопросы по исключениям в с++ :
R>>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки. R>>Как исключение из вложенной функции ловится её вызывающей функцией ? что при этом происходит со стеком ?
C>какой компилятор и операционная система? под виндой со студией одним образом в никсах и gcc другим... проще говоря сохраняется адрес catch, передается управление обработчику который находит нужный тип исключения и передается управление на нужный catch.
Спасибо, очень даже интересно узнать поподробнее.
Сейчас пользуюсь msvs2005, вскоре может придется делать порт на linux, собственно из-за этого и вопросец возник)
Здравствуйте, andrey.desman, Вы писали:
AD>Здравствуйте, riffmaster, Вы писали:
R>>Здравствуйте!
R>>Есть такие вопросы по исключениям в с++ :
R>>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки. R>>Как исключение из вложенной функции ловится её вызывающей функцией ? что при этом происходит со стеком ?
AD>С асмом дружишь? AD>Для VC++: How a C++ compiler implements exception handling. AD>Еще интересная штука: libunwind. Оттуда по ссылке на Itanium C++ ABI: Exception Handling
Здравствуйте, riffmaster, Вы писали:
R>Здравствуйте!
R>Есть такие вопросы по исключениям в с++ :
R>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки.
throw — это в Windows вызов RaiseException с пользовательским кодом.
Здравствуйте, riffmaster, Вы писали:
R>Как реализовано бросание исключений на более низком уровне ? ...try, throw, catch, finally... — это лишь обертки.
На С++ try, throw, catch это и есть самый нижний уровень. Всё что ниже — это уже детали реализации. Они могут отличаться в зависимости от компилятора, платформы и т.д.
finally вообще к языку С++ не относится. Компилятор от Mircrosoft поддерживает эту фичу, но подобный код не будет соответствовать стандарту.
Здравствуйте, riffmaster, Вы писали:
R>Сейчас пользуюсь msvs2005, вскоре может придется делать порт на linux, собственно из-за этого и вопросец возник)
Есть смысл изучать, если просто интересно. Для портирования на линукс тебе это может понадобится только если у тебя там уж совсем грязные низкоуровневые хаки.