簡體   English   中英

Haskell異常處理如何工作?

[英]How does Haskell exception handling work?

foldl1 (+) []

如何捕獲結果錯誤?

純代碼可能會拋出異步的, 不精確的異常 ,例如,當部分函數遇到輸入時,它無法處理。

這些是邏輯錯誤,通常表示程序規范中的錯誤。

它們可能通過異常處理程序被IO代碼(通常在程序的外層)捕獲。

例如,要捕獲空列表的遺漏案例,

{-# 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 ()

我們可以觀察到異常被捕獲,並且程序終止。

$ ./A
"This program as a bug: Prelude.foldl1: empty list"

所有你需要了解的haskell例外 (在一個簡單的閱讀:)

純粹答案:結果未定義(具體來說, 底部 )。 如果以任何方式使用該值來構建程序的結果,則除了崩潰之外,您無法執行任何操作。 參見Haskell 98 Report 3.1節 它指定這樣的“錯誤導致程序立即終止並且不能被用戶捕獲”。

最好檢查輸入值並在它們可以實現這一目標之前對其進行處理。 如果列表可以包含0個元素,請不要使用fold1。

但在實踐中,您可以使用其他答案中的方法在使用GHC時在IO中捕獲它。 異常不能在純(非IO)代碼中捕獲,因為引發異常是控制流的變化是副作用,而不是純計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM