Don*_*art 14

纯代码可能会抛出异步的,不精确的异常,例如,当部分函数遇到输入时,它无法处理.

这些是逻辑错误,通常表示程序规范中的错误.

它们可能通过异常处理程序被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 ()
Run Code Online (Sandbox Code Playgroud)

我们可以观察到异常被捕获,并且程序终止.

$ ./A
"This program as a bug: Prelude.foldl1: empty list"
Run Code Online (Sandbox Code Playgroud)

  • 我认为该程序也作为其异常andler中的一个bug :-) (4认同)
  • 这个程序不是管道. (4认同)