Вы можете перехватить все исключения с помощью SomeException
, но обычно это плохая идея, потому что вы также заканчиваете тем, что ловите асинхронные исключения, которые выбрасываются в поток извне.
В Haskell часто используют асинхронные исключения для запуска отмены потоков из других потоков, сигнал об ошибках памяти и т.п.И очень редко вы хотите поймать асинхронное исключение;они в значительной степени не связаны с реальной логикой потока.Но вы все равно можете использовать такие функции, как bracket
и finally
, чтобы ресурсы, удерживаемые уничтоженным потоком, были правильно освобождены.
Существуют такие пакеты, как safe-exceptions и unliftio, которые помогают избежать перехвата асинхронных исключений по ошибке, и в то же время предоставляют функции типа catchAny
, которые перехватывают другие типы исключений.