2011-09-24 10 views
5

W dokumentacji dla Control.Exception w wersji 4.4.0.0 podano przykład tworzenia hierarchii wyjątków. Przykład pokazuje, w jaki sposób można złapać uogólnienia określonych wyjątków, deklarując wystąpienia klasy wyjątków pod kątem wyjątku nadrzędnego. To jest fajne, ale w jaki sposób uczynić moje wyjątki dziećmi istniejących wyjątków. Na przykład chcę, aby wyjątki, które są przechwytywane przez ograniczenia typu na IOException. Przykład ten pokazuje, w Control.Exception:Haskell Extensible IO Exceptions?

*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException))) 
Caught MismatchedParentheses 

*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: IOException))) 
*** Exception: MismatchedParentheses 

Jak mogę uzyskać ograniczeń IOException złapać wyjątki?

+0

Wygląda na to, że Haddock nie renderował poprawnie dokumentacji. Kliknij hiperłącze 'Source', aby zobaczyć poprawną definicję (jeśli go tutaj skopiuję, SO prawdopodobnie też je wyrenderuje ...) –

Odpowiedz

2

Nie możesz. IOException nie jest zaprojektowany do rozszerzania w taki sposób.

Ogólnie rzecz biorąc, nie można rozszerzyć istniejących typów danych, chcąc nie chcąc. Jest ku temu dobry powód, ponieważ wymagałoby to istniejących funkcji, aby wiedzieć, co zrobić z nowymi wartościami. Są na to różne sposoby, ale wszystkie wymagają, aby typ danych był projektowany z myślą o tym.

Nie jest dla mnie jasne, dlaczego chcesz, aby twoje wyjątki były traktowane jak wyjątki IO. Jeśli chcesz złapać oba typy, po prostu zagnieżdż aplikacje o numerach catch, po jednym dla każdego typu. A może lepiej byłoby odwrócić sytuację i pozwolić, aby wyjątki IO były zawijane w ramach własnego typu wyjątku. Dokumentacja ma już dobre przykłady tego, jak to zrobić. Wszystko sprowadza się do tego, co próbujesz osiągnąć.