2013-05-13 3 views
3

Когда я использую поймать, я получаю это предупреждение:Как я могу правильно использовать catch?

Warning: In the use of `catch' 
     (imported from System.IO.Error): 
     Deprecated: "Please use the new exceptions variant, Control.Exception.catch" 

Я пытался использовать Control.Exception.catch вместо этого, но я чеканка ошибки вниз слишком много отверстий крысы. Может ли кто-нибудь опубликовать пример, где второй аргумент catch поймает ошибку UnsupportedOperation, вызванную getTemporaryDirectory?

tempdir <- catch (getTemporaryDirectory) 
       (\e -> return ".") 

Кроме того, как я использую синтаксис поймать в улове документы:

catch f (\e -> ... (e :: SomeException) ...) 

Я перепробовал все вариации этого синтаксиса я могу думать, и я всегда получаю сообщение об ошибке; не представляется возможным заключить аннотацию типа (?) в круглых скобках, например, в лямбда. Крайне плохая документация, на мой взгляд. К сожалению, это кажется стандартом, к которому стремятся писатели-докеры.

ответ

3

Простой трюк, который работает без каких-либо расширений:

m `catch` (\e -> do 
    let _ = e :: IOException -- or whatever exception type you want to catch 
    doStuff) 

Если вы используете значение e, то вы можете просто положить аннотацию типа, где вы его используете:

m `catch` (\e -> do 
    print (e :: IOException) 
    doStuff) 
+1

ISN» Не считалось ли плохой практикой ловить все исключения? Я пытаюсь ограничить улов, чтобы поймать только UnsupportedOperation. Когда я использую e :: UnsupportedOperation, я получаю конструктор типа или класс 'UnsupportedOperation '. Я также отмечу, что я посмотрел высоко и в документах haskell для списка исключений haskell безрезультатно. – 7stud

+1

О! Вы ловите 'IOException', а затем используете функции из' System.IO.Error', чтобы определить, какой тип 'IOException' он есть. Однако последняя 'base' не имеет' UnsupportedOperation' 'IOException'. У этого есть ошибка незаконной операции, которую вы можете протестировать с помощью 'isIllegalOperation', но мне нужно проверить, является ли это правильным исключением для catch для этой функции. Оставайтесь на линии. –

+0

@ 7stud Извините, я не могу понять, какое исключение он бросит. :(Лучше всего на данный момент просто ловить 'IOException'. –

Смежные вопросы