2013-06-28 15 views
5

Secondo the System.Directory haddock, renameFile potrebbe non riuscire con una serie di ragioni: si è verificatoHaskell: cattura di basso livello IO eccezioni

  • HardwareFault un errore di I/O fisico. [EIO]
  • InvalidArgument Entrambi gli operandi non sono un nome file valido. [ENAMETOOLONG, ELOOP]
  • isDoesNotExistError/NoSuchThing Il file originale non esiste o non esiste alcun percorso per la destinazione. [ENOENT, ENOTDIR]
  • isPermissionError/PermissionDenied Il processo dispone di privilegi insufficienti per eseguire l'operazione. [EROFS, EACCES, EPERM]
  • ResourceExhausted Sono disponibili risorse insufficienti per eseguire l'operazione. [EDQUOT, ENOSPC, ENOMEM, EMLINK]
  • Vincoli insoddisfatti I vincoli dipendenti dall'implementazione non sono soddisfatti. [EBUSY]
  • UnsupportedOperation L'implementazione non supporta la ridenominazione in questa situazione. [EXDEV]
  • InappropriateType Ciascun percorso si riferisce a una directory esistente. [ENOTDIR, EISDIR, EINVAL, EEXIST, ENOTEMPTY]

Un paio di questi (isPermissionError, isDoesNotExistError) hanno funzioni di test, ma altri (tra cui UnsupportedOperation, in cui sono interessato) non sembrano corrispondere a nulla. Che cos'è UnsupportedOperation e come posso verificarlo?

Più in generale, come dovrei andare a scoprire che cos'è qualcosa del genere. Non riesco a vedere da nessuna parte nel codice sorgente in cui è sollevato, quindi suppongo che sia un involucro intorno a un errore di livello inferiore - ma come dovrei gestirmi con quelli?

risposta

5

UnsupportedOperation è ghc-specific. Quindi devi importare GHC.IO.Exception, contiene tutto il necessario per controllare il tipo di eccezione.

Ecco un esempio:

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

Ti dispiacerebbe dare un esempio? Sto provando 'IOError _ UnsupportedOperation _ _ _ _ -> Just x' ma ricevo lamentele sull'esportazione IOError/IOException. – Impredicative

+0

Non sono sicuro di cosa sia esattamente sbagliato con il tuo pattern matching, mi sembra ok. Ho aggiunto un esempio completo che compila e lavora per me. – Yuras

+0

Hah! Effettuando un'importazione non qualificata completamente non mi è venuto in mente! Grazie! – Impredicative