2012-03-21 12 views
7

Zróbmy następujące założenia:Czy istnieje sposób na uzyskanie wyjątku w Haskell?

  • mój program przerywa z powodu nieprzechwyconego wyjątkiem
  • Nie mam pojęcia, co typ tego wyjątku jest
  • komunikat o błędzie drukowana nie zawiera wskazówkę na temat rodzaju wyjątków

Jak dowiem się, jaki jest ten wyjątek?

Minimal przykład:

main = error "foo" 

(. Tutaj to oczywiście ErrorCall, ale nie można powiedzieć z komunikatem o błędzie)

Odpowiedz

16

Tak. Wszystkie typy Exception muszą być instancjami Typeable, zakładając, że korzystasz z API nowych wyjątków.

import Control.Exception 
import Data.Typeable 
import Prelude hiding (catch) 

realMain = error "example" 
main = realMain `catch` h where 
    h (SomeException e) = do 
    putStrLn $ "Caught exception of type " ++ show (typeOf e) 
    putStrLn $ show e 

Wyniki:

 
Caught exception of type GHC.Exception.ErrorCall 
example 
+0

Próbował pan jest? Nie, ale zakładam, że to wydrukuje 'SomeException'. – user1078763

+2

Kod Haskella '(SomeException e)' does ** not ** oznacza, że ​​'e' ma typ' SomeException', który zostałby napisany 'e :: SomeException' (ale nie może pojawić się we wzorach). Jedyny występ "SomeException" powyżej jest konstruktorem. Istnieją dwie rzeczy o nazwie "SomeException": typ i konstruktor. –

+0

Ah, nie przeczytałem poprawnie kodu. Więc tak, to rzeczywiście zadziała. Nie przy pierwszym strzale dla wyjątków, które siedzą głęboko w hierarchii, ale mogę się tam dostać krok po kroku. – user1078763

Powiązane problemy