История изменений
Исправление monk, (текущая версия) :
В комбинации с возможностью продолжить выполнение с любой инструкции это позволяет выполнять строки кода повторно после исключения.
Нельзя исправить программу перед продолжением вычисления.
Абсолютно все ЯП отказались от возобновляемых исключений
???
Common Lisp, Racket, … - уже два примера, которые не откзались.
но если стэк уже размотался, то в любом случае возобновить работу программы так, будто ничего не произошло, будет крайне трудно — я сомневаюсь, что даже CL так умеет.
В любом языке, поддерживающем продолжения, можно восстановить стэк из продолжения. В CL обработчик исключения работает до раскрутки стека.
при этом совершенно бесполезны в рантайме — все задачи, которые можно для них придумать, можно решить невозобновляемыми исключениями проще и предсказуемее
И каким же образом. Например, если я пишу разборщик журнала на лиспе, я могу написать
(defun parse-log-entry (text)
(if (well-formed-log-entry-p text)
(make-instance 'log-entry ...)
(restart-case (error 'malformed-log-entry-error :text text)
(use-value (value) value)
(reparse-entry (fixed-text) (parse-log-entry fixed-text)))))
То есть, если запись корректна, вернуть разбор. Иначе вызвать исключение malformed-log-entry-error с текстом записи и позволить обработчику заменить результат разбора (use-value) или заменить текст записи журнала (reparse-entry) для продолжения разбора. Как решишь при помощи невозобновляемого исключения? Вручную запишешь весь контекст парсера?
Исходная версия monk, :
В комбинации с возможностью продолжить выполнение с любой инструкции это позволяет выполнять строки кода повторно после исключения.
Нельзя исправить программу перед продолжением вычисления.
Абсолютно все ЯП отказались от возобновляемых исключений
???
Common Lisp, Racket, … - уже два исключения
но если стэк уже размотался, то в любом случае возобновить работу программы так, будто ничего не произошло, будет крайне трудно — я сомневаюсь, что даже CL так умеет.
В любом языке, поддерживающем продолжения, можно восстановить стэк из продолжения. В CL обработчик исключения работает до раскрутки стека.
при этом совершенно бесполезны в рантайме — все задачи, которые можно для них придумать, можно решить невозобновляемыми исключениями проще и предсказуемее
И каким же образом. Например, если я пишу разборщик журнала на лиспе, я могу написать
(defun parse-log-entry (text)
(if (well-formed-log-entry-p text)
(make-instance 'log-entry ...)
(restart-case (error 'malformed-log-entry-error :text text)
(use-value (value) value)
(reparse-entry (fixed-text) (parse-log-entry fixed-text)))))
То есть, если запись корректна, вернуть разбор. Иначе вызвать исключение malformed-log-entry-error с текстом записи и позволить обработчику заменить результат разбора (use-value) или заменить текст записи журнала (reparse-entry) для продолжения разбора. Как решишь при помощи невозобновляемого исключения? Вручную запишешь весь контекст парсера?