2011-09-24 18 views
5

Nella documentazione per Control.Exception nella versione 4.4.0.0 di base è disponibile un esempio di come creare gerarchie di eccezioni. L'esempio mostra come è possibile rilevare le generalizzazioni di specifiche eccezioni dichiarando le istanze della classe Exception in termini dell'eccezione genitore. Questo è bello, ma come faccio a rendere le mie eccezioni figli di eccezioni esistenti. Ad esempio, desidero rendere le eccezioni catturate dai vincoli di tipo su IOException. L'esempio in questo Control.Exception mostra:Eccezioni IO estensibili Haskell?

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

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

Come posso ottenere vincoli IOException per prendere il mio eccezioni?

+0

Sembra che Haddock non abbia reso correttamente la documentazione. Clicca sul collegamento ipertestuale 'Origine' per vedere la definizione corretta (se lo copio qui SO probabilmente lo renderà anche male ...) –

risposta

2

Non è possibile. IOException non è progettato per essere estensibile in questo modo.

In generale, non è possibile estendere i tipi di dati esistenti, volenti o nolenti. C'è una buona ragione per questo, poiché richiederebbe alle funzioni esistenti di sapere cosa fare con i nuovi valori. Ci sono modi per aggirare questo, ma tutti richiedono che il tipo di dati sia progettato con questo in mente.

Non è chiaro per me perché si desidera che le eccezioni personalizzate vengano trattate come eccezioni IO, però. Se vuoi catturare entrambi i tipi, annidi le applicazioni di catch, una per ogni tipo. O forse sarebbe meglio cambiare le cose e permettere che le eccezioni IO vengano incluse nel proprio tipo di eccezione. La documentazione ha già dei buoni esempi su come farlo. Tutto si riduce a ciò che stai cercando di ottenere.