LINUX.ORG.RU

История изменений

Исправление 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) для продолжения разбора. Как решишь при помощи невозобновляемого исключения? Вручную запишешь весь контекст парсера?