2013-06-28 13 views
5

Nach the System.Directory haddock, renameFile mit einer Reihe von Gründen fehlschlagen:Haskell: Fang niedriges Niveau IO Ausnahmen

  • HardwareFault Ein physikalischen I/O-Fehler ist aufgetreten. [EIO]
  • InvalidArgument Entweder der Operand ist kein gültiger Dateiname. [ENAMETOOLONG, ELOOP]
  • isDoesNotExistError/NoSuchThing Die ursprüngliche Datei existiert nicht oder es gibt keinen Pfad zum Ziel. [ENOENT, ENOTDIR]
  • isPermissionError/PermissionDenied Der Prozess verfügt nicht über ausreichende Berechtigungen zum Ausführen des Vorgangs. [EROFS, EACCES, EPERM]
  • ResourceExhausted Es sind nicht genügend Ressourcen verfügbar, um den Vorgang auszuführen. [EDQUOT, ENOSPC, ENOMEM, EMLINK]
  • Unbefriedigte Bedingungen Die implementierungsabhängigen Bedingungen sind nicht erfüllt. [EBUSY]
  • Nicht unterstützteOperation Die Implementierung unterstützt das Umbenennen in dieser Situation nicht. [EXDEV]
  • InadäquateTyp Jeder Pfad verweist auf ein vorhandenes Verzeichnis. [ENOTDIR, EISDIR, EINVAL, EEXIST, ENOTEMPTY]

Ein paar von diesen (isPermissionError, isDoesNotExistError) Testfunktionen haben, aber andere (einschließlich UnsupportedOperation, in der ich bin interessiert) scheinen nicht zu entsprechen etwas. Was ist UnsupportedOperation und wie kann ich es testen?

Allgemein gesagt, wie soll ich herausfinden, was so etwas ist. Ich kann nirgendwo im Quellcode sehen, wo es sich befindet, also vermute ich, dass es sich um einen Fehler auf niedrigerer Ebene handelt - aber wie soll ich damit umgehen?

Antwort

5

UnsupportedOperation ist ghc-specific. Sie müssen also GHC.IO.Exception importieren, es enthält alles, was Sie brauchen, um den Ausnahmetyp zu überprüfen. Hier

ein Beispiel:

import Control.Exception 
import GHC.IO.Exception 

main :: IO() 
main = do 
    action `catch` (\(IOError _ UnsupportedOperation _ _ _ _) -> print "UnsupportedOperation") 
    where 
    action = throw $ IOError Nothing UnsupportedOperation "loc" "desc" Nothing Nothing 
+0

Möchten Sie ein Beispiel etwas dagegen zu geben? Ich versuche 'IOError _ UnsupportedOperation _ _ _ _ -> Just x' aber Beschwerden über nicht exportiere IOError/IOException. – Impredicative

+0

Ich bin nicht sicher, was genau stimmt mit Ihrem Mustervergleich, es sieht für mich in Ordnung. Ich fügte ein vollständiges Beispiel hinzu, das kompiliert und für mich arbeitet. – Yuras

+0

Hah! Es ist mir nicht gelungen, einen unqualifizierten Import durchzuführen! Vielen Dank! – Impredicative