В настоящее время я пытаюсь обратить внимание на правильный способ использования исключений в Haskell. Как работают исключения, достаточно прямолинейно; Я пытаюсь получить четкое представление о правильном способе их интерпретации.
Основная позиция заключается в том, что в хорошо разработанном приложении исключения не должны выходить на верхний уровень. Любое исключение явно является тем, что дизайнер не ожидал - то есть ошибка программы (например, деление на ноль), а не необычное время выполнения (например, файл не найден).
С этой целью я написал простой обработчик исключений верхнего уровня, который улавливает все исключения и печатает сообщение stderr
, говорящее "это ошибка" (до повторного исключения исключения для завершения программы).
Однако предположим, что пользователь нажимает Ctrl + C. Это вызывает исключение. Очевидно, что это не какая-то ошибка программы. Однако неспособность предвидеть и реагировать на прерывание пользователя, такое как это, может считаться ошибкой. Поэтому, возможно, программа должна поймать это и обработать его надлежащим образом, сделав необходимую очистку перед выходом.
Дело в том, что... Код, который обрабатывает это, поймает исключение, освободит любые ресурсы или что-то еще, а затем убьет исключение! Поэтому, если исключение делает его на верхнем уровне, это не обязательно означает, что он был необработанным. Это просто означает, что мы хотели быстро выйти.
Итак, мой вопрос: должны ли исключения использоваться для контроля потока таким образом? Должна ли каждая функция, которая явно ловит UserInterrupt
, использовать явные конструкции управления потоком, чтобы выходить из нее вручную, а не восстанавливать исключение? (Но как узнать, как вызывающий может выйти?) Возможно ли, чтобы UserInterrupt
достиг верхнего уровня? Но в этом случае, нормально ли для ThreadKilled
тоже по тому же аргументу?
Короче говоря, должен ли обработчик прерывания сделать специальный случай для UserInterrupt
(и, возможно, ThreadKilled
)? Как насчет HeapOverflow
или StackOverflow
? Это ошибка? Или это "обстоятельство, выходящее за рамки управления программой"?