Odpowiedz
Czysty kod może rzucić asynchroniczny, imprecise exceptions, na przykład, gdy częściowy funkcja napotka wejście to nie ma sprawy w obsłudze.
Są to błędy logiczne, zwykle wskazujące na błędy w specyfikacji programu.
Mogą zostać przechwycone w kodzie IO (zwykle w zewnętrznej warstwie programu), za pośrednictwem exception handler.
Na przykład, aby złapać brakujące sprawę do pustej listy,
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE BangPatterns #-}
import Control.Exception
main = do
handle (\(e :: SomeException) -> print $ "This program as a bug: " ++ show e) $ do
let !v = foldl1 (+) ([] :: [Int])
return()
Możemy zaobserwować, że wyjątek zostanie złapany, a program kończy.
$ ./A
"This program as a bug: Prelude.foldl1: empty list"
Myślę, że program również jako błąd w jego wyjątku andler :-) –
Ten program nie jest fajką. –
Ta wymiana przyniosła mi wiele apelacji. – sclv
All you need to know about haskell exceptions (w łatwy odczyt :)
Purist odpowiedź: wynik jest niezdefiniowany (konkretnie bottom). Nie możesz nic z tym zrobić, oprócz awarii, jeśli wartość jest używana w jakikolwiek sposób do budowania wyników programu. Zobacz Haskell 98 Report section 3.1. Określa, że takie "błędy powodują natychmiastowe zakończenie programu i nie mogą zostać przechwycone przez użytkownika".
Najlepiej sprawdzić wartości wejściowe i obsłużyć je, ZANIM osiągną tak daleko. Nie używaj fold1, jeśli lista może zawierać 0 elementów.
W praktyce jednak można użyć metod z innych odpowiedzi, aby złapać go w IO podczas korzystania z GHC. Wyjątki nie mogą zostać przechwycone w czystym kodzie (innym niż IO), ponieważ podniesienie wyjątku jest zmianą w przepływie sterowania, jest efektem ubocznym, a nie czystym obliczeniem.
- 1. Haskell: obsługa wyjątków w monadach bez IO
- 2. ASP.NET MVC 4 - Obsługa wyjątków nie działa
- 3. Obsługa wyjątków węzła
- 4. Obsługa wyjątków pracowników tła
- 5. Obsługa wyjątków w Linuksie
- 6. Obsługa wyjątków ASP.NET MVC
- 7. Obsługa wyjątków Python
- 8. EJB 3.0 Obsługa wyjątków
- 9. Obsługa wyjątków NHibernate
- 10. Obsługa wyjątków w wątkach
- 11. Camel - Obsługa wyjątków w
- 12. Obsługa wyjątków Wcf
- 13. Obsługa wyjątków w R
- 14. Obsługa wyjątków Spring Resttemplate
- 15. NSFileHandle writeData: obsługa wyjątków
- 16. Obsługa licencji TPL i wyjątków
- 17. Obsługa wyjątków globalnych w VB
- 18. Obsługa wyjątków w rdzeniu asp.net?
- 19. Reflection.Emit.ILGenerator Obsługa wyjątków „Leave” Instrukcja
- 20. Obsługa wyjątków zmiennoprzecinkowych w C++
- 21. Obsługa wszystkich wyjątków oprócz jednego
- 22. Obsługa wyjątków w rozszerzeniach Chrome
- 23. Obsługa wyjątków API w RxJava
- 24. LLVM MCJIT/SEH Obsługa wyjątków
- 25. Obsługa wyjątków w kontrolerach Grails
- 26. Obsługa błędów STL bez wyjątków
- 27. Obsługa wyjątków przez Reactor Wiosna
- 28. Obsługa wyjątków dla wielu tras
- 29. Obsługa wyjątków w Obj-C
- 30. Obsługa wyjątków ObjC w monotouch
Zobacz także http://stackoverflow.com/questions/3642793/why-can-haskell-exceptions-only-be-caught-inside-the-io-monad –
To naprawdę nie ma znaczenia, to tylko kwestia czasu, zanim biblioteka "safe-failure" przejęła świat ;-). –
Jakiej bezpiecznej biblioteki? – qrest