![]() |
|
|
![]()
|
|
| polosatij |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: нет Всего: 8 |
завтра расказать надо будет в школе, ничего в нете не могу найти нашёл только: # Fehler können vollständig abgefangen und behoben werden. Der Code kann an der Fehlerstelle fortgesetzt werden. # Common Lisp unterscheidet zwischen Fehler signalisieren, Fehler behandeln und Restarts. # ошибки могут быть полностью пойманы и "исправлены". код может быть продолжен с того места, где произошла ошибка # Common Lisp разрешает между "показать ошибку", "исправить ошибку" и "рестартом".. здесь кое-что на эту тему: http://www.gigamonkeys.com/book/beyond-exc...d-restarts.html вопрос: как можно перехватить все возможные ошибки? runtime ошибки? подобные? есть ли проблемы здесь? Это сообщение отредактировал(а) polosatij - 21.5.2006, 19:19 |
|||
|
||||
| svg |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2005 Репутация: 14 Всего: 18 |
Лучше всего обратиться к данному документу Condition Handling in the Lisp Language Family Наиболее общим классом, в принципе о системе исключений (condition) Commion Lisp можно думать как о классах, так привычнее, является error, поэтому, перехватывая error, перехватываем все прочие. Заранее извиняюсь за скобки, не проверял.
Перехватить ошибку с рестартом в точке возникновения ошибки можно, используя handler-bind. Возможные рестарты определяются с помощью restart-case
|
||||||
|
|||||||
| polosatij |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: нет Всего: 8 |
существуют ли ошибки, какие нельзя перехватить? => проблемы с памятью и прочие.. что случаеться в таких случаях? что случиться, если в коде опять будет ошибка? => и так до потери пульса Это сообщение отредактировал(а) polosatij - 21.5.2006, 23:16 |
|||
|
||||
| svg |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2005 Репутация: 14 Всего: 18 |
В случае непоправимых проблем, в интерактивном режиме система вывалится в низкоуровневый отладчик ldb, в неинтерактивном - прервет вычисления. Ошибки, которые явно не стоит перехватывать можно узнать, поинтересовавшись кодом функции ignore-errors. Точно знаю, что она не перехватывает storage-condition.
Код рестарта выполняется вместо restart-case и кода в нем, а не внутри. Рестартов может быть несколько и в handler-bind можно выбрать стратегию анализа и прервать вычисления, вызвав соотвествующий рестарт. Интерактивный отладчик предоставляет список рестартов сам, позволяя выбрать пользователю. Это сообщение отредактировал(а) svg - 22.5.2006, 00:22 |
||||
|
|||||
| polosatij |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: нет Всего: 8 |
хм.. а чем он отличаеться от простого exception-а тогда? ведь я могу сделать так, заглишить exception и вызвать методу ( в которой произошла ) ошибка => рекурсивно ещё раз ?! Это сообщение отредактировал(а) polosatij - 22.5.2006, 00:30 |
|||
|
||||
| svg |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 13.4.2005 Репутация: 14 Всего: 18 |
Сделать можно все. Вопрос - зачем?
Рестарты предоставляют хорошую возможность по управлению исключениями, но если пациент так твердо решил помереть, то все равно помрет, на то и дадена ему эволюцией и божьим промыслом сила интеллекта. |
|||
|
||||
| adejneka |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 105 Регистрация: 8.7.2005 Где: Москва, Россия Репутация: 9 Всего: 11 |
STORAGE-CONDITION можно попробовать перехватить, используя обычные HANDLER-CASE и HANDLER-BIND. Например, если при выполнении HTTP-запроса у программы переполнился стек, можно откатиться, послать в ответ "не хватает памяти на выполнение запроса" и послать дамп стека по почте администратору сервера (SBCL выдает исключение чуть раньше, чем стек реально заполнится). Почему IGNORE-ERRORS не перехватывает STORAGE-CONDITION написано в вышеупомянутой статье Питмана - это, вообще говоря, не ошибка в программе, а нехватка ресурсов.
Наиболее общим классом является CONDITION. У него есть подклассы SERIOUS-CONDITION (со своими подклассами STORAGE-CONDITION и ERROR) и WARNING. Например, в SBCL с помощью HANDLER-BIND можно попросить компилятор не выдавать предупреждения о странных местах в программе (например, в автоматически генерируемом коде иногда возникают ошибки типов в ветвях программы, которые, в силу известных одному программисту причин, никогда не исполняются). |
||||
|
|||||
| Cr@$h |
|
|||
![]() Исследователь ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1693 Регистрация: 3.4.2005 Где: Санкт-Петербург, Россия Репутация: 1 Всего: 41 |
|
|||
|
||||
![]()
|
| Правила форума LISP | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | LISP | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |