Исходя из этот вопрос, есть ли способ убедиться, что я обрабатываю все исключения? Что-то вроде предупреждения компилятора о полноте сопоставления с образцом, но для исключений. Думаю, в этом есть смысл ...
Вы можете поймать SomeException, который является корнем иерархии исключений. Не существует (afaik) программного способа получить список детализированных типов исключений, которые могут быть выброшены из произвольного кода.
Обратите внимание, что, строго говоря, вы не можете обрабатывать все исключения, например. ThreadBlockedIndefinitoOnMVar приводит к уничтожению потока независимо от того, окружена ли его логика обработчиком или нет. Я не совсем уверен, что происходит с OOM и т. д.
Вы можете перехватить все исключения с помощью SomeException
, но обычно это плохая идея, потому что вы также в конечном итоге перехватываете асинхронные исключения, которые являются брошенный в нить извне.
В Haskell часто используется асинхронные исключения для запуска отмены потока из других потоков, сигнализировать об ошибках памяти и т.п. И очень редко вы хотите перехватить асинхронное исключение; они в значительной степени не связаны с реальной логикой работы потока. Но вы все равно можете использовать такие функции, как bracket
и finally
, чтобы ресурсы, удерживаемые убитым потоком, были должным образом освобождены.
Существуют такие пакеты, как безопасные исключения и unliftio, которые помогают избежать ошибочного перехвата асинхронных исключений, но при этом предоставляют такие функции, как catchAny
, которые перехватывают другие типы исключений.
См. Также видео «Асинхронная обработка исключений в Haskell» youtube.com/watch?v=T5y8sFmCFnA
Возможно полезные ссылки: hackage.haskell.org/package/base-4.12.0.0/docs/…schoolofhaskell.com/user/snoyberg/general-haskell/exceptions /…