2013-06-28 7 views
5

Według the System.Directory haddock, renameFile może zakończyć się niepowodzeniem z kilku powodów: WystąpiłHaskell: łowienie niski poziom wyjątki IO

  • HardwareFault fizyczna I/O error. [EIO]
  • InvalidArgument Każdy argument operand nie jest prawidłową nazwą. [ENAMETOOLONG, ELOOP]
  • isDoesNotExistError/NoSuchThing oryginalnego pliku nie istnieje, lub nie ma ścieżki do celu. [ENOENT, ENOTDIR]
  • isPermissionError/PermissionDenied Proces ma niewystarczające uprawnienia do wykonywania tej operacji. [EROFS, EACCES, EPERM]
  • ResourceExhausted Niewystarczające zasoby są dostępne, aby wykonać tę operację. [, ENOSPC, ENOMEM EMLINK EDQUOT,]
  • UnsatisfiedConstraints ograniczenia zależne od implementacji nie są spełnione. [EBUSY]
  • UnsupportedOperation Implementacja nie obsługuje zmiany nazwy w tej sytuacji. [EXDEV]
  • InappropriateType Każda ścieżka odnosi się do istniejącego katalogu. [ENOTDIR, EISDIR, EINVAL, EEXIST, ENOTEMPTY]

Kilka z nich (isPermissionError, isDoesNotExistError) mają funkcje testowania, ale inni (w tym UnsupportedOperation, w którym jestem zainteresowany) nie wydaje się odpowiadać byle co. Co to jest UnsupportedOperation i jak mogę go przetestować?

Bardziej ogólnie, w jaki sposób powinny przejść o ustaleniu co coś w tym jest. Nie widzę nigdzie w kodzie źródłowym, w którym został podniesiony, więc domyślam się, że jest to opakowanie o niższym poziomie błędu - ale jak mam sobie z tym poradzić?

Odpowiedz

5

UnsupportedOperation jest ghc-specific. Więc musisz zaimportować GHC.IO.Exception, zawiera wszystko, czego potrzebujesz, aby sprawdzić typ wyjątku.

Oto przykład:

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

Mogłabyś dając przykład? Próbuję 'IOError _ UnsupportedOperation _ _ _ _ -> Po prostu x', ale dostaję skargi na temat braku eksportu IOError/IOException. – Impredicative

+0

Nie jestem pewien, co jest dokładnie nie tak z dopasowaniem wzorców, wygląda mi dobrze. Dodałem pełny przykład, który kompiluje i działa dla mnie. – Yuras

+0

Hah! Wykonanie bezwarunkowego importu zupełnie mi się nie przydarzyło! Dzięki! – Impredicative