Поиск:

Ответ в темуСоздание новой темы Создание опроса
> lisp и exceptions, как работают excetpions? 
V
    Опции темы
polosatij
Дата 21.5.2006, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: нет
Всего: 8



smile 

завтра расказать надо будет в школе, ничего в нете не могу найти smile

нашёл только:


# 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


--------------------
PM   Вверх
svg
Дата 21.5.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2005

Репутация: 14
Всего: 18



Цитата(polosatij @  21.5.2006,  19:05 Найти цитируемый пост)
вопрос: как можно перехватить все возможные ошибки? runtime ошибки? подобные? есть ли проблемы здесь? 


Лучше всего обратиться к данному документу Condition Handling in the Lisp Language Family

Наиболее общим классом, в принципе о системе исключений (condition) Commion Lisp
можно думать как о классах, так привычнее, является error, поэтому, перехватывая
error, перехватываем все прочие. Заранее извиняюсь за скобки, не проверял.
Код

(handler-case (progn ...)
  (error (condition)
       (do-here-what-i-whant-on-error)))


Перехватить ошибку с рестартом в точке возникновения ошибки можно, используя
handler-bind. Возможные рестарты определяются с помощью restart-case

Код

(handler-bind (error (condition)
                            #'(lambda (condition)
                                  (invoke-restart (find-restart 'my-restart) condition)))
   (progn
      ...
      (restart-case (progn ...)
          (my-restart (condition) (do-something-with-condition))))


 
PM MAIL   Вверх
polosatij
Дата 21.5.2006, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: нет
Всего: 8





существуют ли ошибки, какие нельзя перехватить? => проблемы с памятью и прочие.. что случаеться в таких случаях?


что случиться, если в коде опять будет ошибка? => и так до потери пульса  smile   

Это сообщение отредактировал(а) polosatij - 21.5.2006, 23:16


--------------------
PM   Вверх
svg
Дата 22.5.2006, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2005

Репутация: 14
Всего: 18



Цитата

существуют ли ошибки, какие нельзя перехватить? => проблемы с памятью и прочие.. что случаеться в таких случаях?


В случае непоправимых проблем, в интерактивном режиме система вывалится в низкоуровневый отладчик ldb, в неинтерактивном - прервет вычисления.

Ошибки, которые явно не стоит перехватывать можно узнать, поинтересовавшись кодом
функции ignore-errors. Точно знаю, что она не перехватывает storage-condition.

Цитата(polosatij @  21.5.2006,  23:08 Найти цитируемый пост)
что случиться, если в коде опять будет ошибка? => и так до потери пульса 


Код рестарта выполняется вместо restart-case и кода в нем, а не внутри.

Рестартов может быть несколько и в handler-bind можно выбрать стратегию
анализа и прервать вычисления, вызвав соотвествующий рестарт.

Интерактивный отладчик предоставляет список рестартов сам, позволяя выбрать пользователю.
  

Это сообщение отредактировал(а) svg - 22.5.2006, 00:22
PM MAIL   Вверх
polosatij
Дата 22.5.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: нет
Всего: 8




хм.. а чем он отличаеться от простого exception-а тогда?
ведь я могу сделать так, заглишить exception и вызвать методу ( в которой произошла ) ошибка => рекурсивно ещё раз ?!
  

Это сообщение отредактировал(а) polosatij - 22.5.2006, 00:30


--------------------
PM   Вверх
svg
Дата 22.5.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 13.4.2005

Репутация: 14
Всего: 18



Сделать можно все. Вопрос - зачем?

Рестарты предоставляют хорошую возможность по управлению
исключениями, но если пациент так твердо решил помереть, 
то все равно помрет, на то и дадена ему эволюцией и божьим
промыслом сила интеллекта.

 
PM MAIL   Вверх
adejneka
Дата 22.5.2006, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 8.7.2005
Где: Москва, Россия

Репутация: 9
Всего: 11



Цитата(svg @ 22.5.2006,  00:16)
Ошибки, которые явно не стоит перехватывать можно узнать, поинтересовавшись кодом
функции ignore-errors. Точно знаю, что она не перехватывает storage-condition.

STORAGE-CONDITION можно попробовать перехватить, используя обычные HANDLER-CASE и HANDLER-BIND. Например, если при выполнении HTTP-запроса у программы переполнился стек, можно откатиться, послать в ответ "не хватает памяти на выполнение запроса" и послать дамп стека по почте администратору сервера (SBCL выдает исключение чуть раньше, чем стек реально заполнится).

Почему IGNORE-ERRORS не перехватывает STORAGE-CONDITION написано в вышеупомянутой статье Питмана - это, вообще говоря, не ошибка в программе, а нехватка ресурсов.

Цитата(svg)

Наиболее общим классом, в принципе о системе исключений (condition) Commion Lisp
можно думать как о классах, так привычнее, является error, поэтому, перехватывая
error, перехватываем все прочие.

Наиболее общим классом является CONDITION. У него есть подклассы SERIOUS-CONDITION (со своими подклассами STORAGE-CONDITION и ERROR) и WARNING. Например, в SBCL с помощью HANDLER-BIND можно попросить компилятор не выдавать предупреждения о странных местах в программе (например, в автоматически генерируемом коде иногда возникают ошибки типов в ветвях программы, которые, в силу известных одному программисту причин, никогда не исполняются). 
PM MAIL   Вверх
Cr@$h
Дата 24.8.2006, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: 1
Всего: 41




M
Cr@$h
svg и adejneka, помогаете ньюбам.

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.