2011-09-24 33 views
5

Trong tài liệu hướng dẫn cho Control.Exception trong cơ sở 4.4.0.0, có một ví dụ về cách thực hiện phân cấp ngoại lệ. Ví dụ này cho thấy cách người ta có thể nắm bắt khái quát về một ngoại lệ cụ thể bằng cách khai báo các cá thể của lớp Ngoại lệ về ngoại lệ của cha mẹ. Điều này thật tuyệt, nhưng làm thế nào để tôi có ngoại lệ cho trẻ em của các trường hợp ngoại lệ hiện tại. Ví dụ, tôi muốn thực hiện các ngoại lệ bị bắt bởi các ràng buộc kiểu trên IOException. Ví dụ trong Control.Exception cho thấy điều này:Haskell Extensible IO Exceptions?

*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: SomeCompilerException))) 
Caught MismatchedParentheses 

*Main> throw MismatchedParentheses catch (\e -> putStrLn ("Caught " ++ show (e :: IOException))) 
*** Exception: MismatchedParentheses 

Làm cách nào để nhận ngoại lệ IOException để bắt ngoại lệ của tôi?

+0

Dường như Haddock không hiển thị tài liệu đúng cách. Nhấp vào liên kết 'Source' để xem định nghĩa đúng (nếu tôi sao chép nó ở đây SO có lẽ cũng sẽ hiển thị sai nó ...) –

Trả lời

2

Bạn không thể. IOException không được thiết kế để có thể mở rộng theo cách như vậy.

Nói chung, bạn không thể mở rộng các loại dữ liệu hiện có. Có một lý do chính đáng cho điều đó, vì nó sẽ yêu cầu các hàm sẵn có để biết phải làm gì với các giá trị mới. Có nhiều cách xung quanh điều này, nhưng tất cả chúng đều yêu cầu kiểu dữ liệu được thiết kế với điều này trong tâm trí.

Không rõ ràng đối với tôi lý do tại sao bạn muốn ngoại lệ tùy chỉnh của mình được xử lý như ngoại lệ IO. Nếu bạn muốn nắm bắt cả hai loại, chỉ cần lồng các ứng dụng của catch, một cho mỗi loại. Hoặc có lẽ tốt hơn là nên xoay vòng và cho phép các ngoại lệ IO được bọc trong loại ngoại lệ của riêng bạn. Tài liệu đã có các ví dụ tốt về cách thực hiện điều đó. Tất cả đều đến với những gì bạn đang cố gắng đạt được.

Các vấn đề liên quan