Tóm tắt nội dung chính
- Checked exception của Java tuy là một tính năng bị cộng đồng chỉ trích rộng rãi, nhưng lại có ưu điểm nổi bật về mặt an toàn kiểu.
- Nó cung cấp cơ chế an toàn kiểu về mặt khái niệm tương tự
Result<T, E> của Rust hay Either a b của Haskell.
- Checked exception biểu đạt tường minh khả năng thất bại tiềm ẩn trong chữ ký phương thức, từ đó buộc phải xử lý lỗi thông qua hệ thống kiểu.
Ưu điểm của checked exception
- Cung cấp an toàn kiểu bằng cách kiểm tra việc xử lý ngoại lệ tại thời điểm biên dịch.
- Ghi rõ khả năng phát sinh ngoại lệ trong chữ ký phương thức bằng mệnh đề
throws, biến nó thành một phần của hợp đồng API.
- Chỉ cần khai báo là có thể tự động truyền ngoại lệ lên trên, cung cấp một cơ chế thuận tiện.
- Khác với Rust, không cần thêm cú pháp như toán tử
? ở mỗi lần gọi.
Vấn đề của checked exception
- Gây ra quá nhiều mã boilerplate trong chuỗi lời gọi.
- Thiếu khả năng tương thích với lập trình hàm như lambda và Stream API được đưa vào từ Java 8 trở đi.
- Khó tiến hóa API vì việc thêm ngoại lệ mới vào interface có thể phá vỡ tính tương thích.
- Có thể cổ vũ các anti-pattern kiểu bỏ qua ngoại lệ.
Đề xuất cải tiến
- Cải thiện functional interface để lambda có thể khai báo checked exception.
- Bổ sung hỗ trợ kiểu ngoại lệ generic trong mệnh đề
throws.
- Mở rộng API để xử lý checked exception tốt hơn trong ngữ cảnh hàm.
- Tích hợp tốt hơn với API
Optional<T> và Stream<T>.
So sánh với các ngôn ngữ khác
- Rust: cung cấp cơ chế xử lý lỗi tường minh thông qua
Result<T, E> và toán tử ?.
- Kotlin: biến mọi ngoại lệ thành unchecked, nhưng cung cấp các cấu trúc hàm như
runCatching.
- Scala: hỗ trợ xử lý lỗi theo phong cách hàm thông qua các kiểu monad như
Try[T], Either[A, B].
Kết luận
- Checked exception là một tính năng đổi mới của Java đã bị hiểu sai và cần được đánh giá lại.
- Thay vì từ bỏ hoàn toàn, sẽ hợp lý hơn nếu cải tiến nó để phù hợp với các tính năng Java hiện đại.
- Vẫn có khả năng phát triển theo hướng giải quyết các vấn đề thực tiễn trong khi giữ nguyên mô hình hiện có.
- Điều quan trọng là tìm được điểm cân bằng giữa an toàn kiểu, sự ngắn gọn của mã và tính linh hoạt.
1 bình luận
Tôi có cảm giác như đang lặp lại một cuộc tranh luận đã được nói đến suốt hơn chục năm nay. Có vẻ đây là lập luận rằng Exception cũng có giá trị ngang với Type, và tôi muốn thử trả lời rằng chỉ cần Type là đủ.