Haskell:
Xử lý lỗi

Làm thế nào:

Haskell xử lý lỗi một cách mạnh mẽ thông qua các kiểu như MaybeEither. Dưới đây là một cái nhìn nhanh:

safeDivide :: Integral a => a -> a -> Maybe a
safeDivide _ 0 = Nothing  -- Chia cho không là không được, vì thế chúng ta trả về Nothing.
safeDivide x y = Just (x `div` y)  -- Nếu không, mọi thứ đều ổn, trả về kết quả trong Just.

-- Hãy xem nó hoạt động như thế nào:
example1 :: Maybe Int
example1 = safeDivide 10 2  -- Just 5

example2 :: Maybe Int
example2 = safeDivide 10 0  -- Nothing

Đối với việc xử lý lỗi phức tạp hơn, Either được sử dụng:

safeDivideEither :: Integral a => a -> a -> Either String a
safeDivideEither _ 0 = Left "Lỗi chia cho không."  -- Lần này, lỗi mang một thông điệp.
safeDivideEither x y = Right (x `div` y)

-- Và khi sử dụng:
example3 :: Either String Int
example3 = safeDivideEither 10 2  -- Right 5

example4 :: Either String Int
example4 = safeDivideEither 10 0  -- Left "Lỗi chia cho không."

Sâu hơn

Trong thế giới Haskell, xử lý lỗi có một lịch sử đáng kể. Ngày xưa, lỗi có thể làm sập toàn bộ chương trình của bạn—không vui vẻ gì cả. Hệ thống kiểu của Haskell cung cấp các cách làm cho điều này ít xảy ra hơn. Chúng ta có MaybeEither, nhưng còn có những loại khác như ExceptionsIO cho các tình huống khác nhau.

Maybe là đơn giản: bạn nhận được Just điều gì đó nếu mọi thứ ổn, hoặc Nothing nếu không. Either nâng cao hơn, cho phép bạn trả về một thông điệp lỗi (Left) hoặc một kết quả thành công (Right).

Cả hai đều là pure, có nghĩa là chúng không can thiệp vào thế giới bên ngoài - một điều lớn lao trong Haskell. Chúng tôi tránh được những cạm bẫy của các ngoại lệ không được kiểm tra mà làm phiền một số ngôn ngữ khác.

Đối với những người không hài lòng với MaybeEither, các thư viện như Control.Exception cung cấp xử lý lỗi theo phong cách lập trình thủ tục truyền thống qua các ngoại lệ. Nhưng sử dụng chúng một cách tự do quá mức có thể làm phức tạp mọi chuyện, vì vậy cộng đồng thường gắn bó với các kiểu.

Xem thêm

Đào sâu hơn với: