Trang chủ > Uncategorized > Checked exception trong Java và C#

Checked exception trong Java và C#

Có một thứ mình từng thấy rất khó chịu khi dùng C#, là nó không hỗ trợ checked exception. Trong Java, checked exception nôm na là các exception không phải do lỗi lập trình, mà là những tình huống đặc biệt, như không tìm được file, v.v. Bạn bắt buộc phải catch các exception này, hoặc throw lại nó. Với C#, tất cả các exception đều là unchecked. Điều đó có nghĩa là bạn phải dựa vào tài liệu hỗ trợ hoặc xem trực tiếp code để biết các exception mà một method có thể throw. Và việc không chắc chắn phải catch các exception có vẻ như sẽ gây trở ngại trong việc xây dựng một chương trình tốt.

Nhưng theo Anders Hejlsberg (kiến trúc sư trưởng của C#), thì cái cách Java hiện thực checked exception có vẻ không tốt. Tức là, checked exception vẫn là một ý tưởng hữu ích:

Frankly, they look really great up front, and there’s nothing wrong with the idea. I completely agree that checked exceptions are a wonderful feature. It’s just that particular implementations can be problematic. By implementing checked exceptions the way it’s done in Java, for example, I think you just take one set of problems and trade them for another set of problems. In the end it’s not clear to me that you actually make life any easier. You just make it different.

Nhưng giải pháp Java đưa ra thì có vấn đề:

The concern I have about checked exceptions is the handcuffs they put on programmers. You see programmers picking up new APIs that have all these throws clauses, and then you see how convoluted their code gets, and you realize the checked exceptions aren’t helping them any. It is sort of these dictatorial API designers telling you how to do your exception handling. They should not be doing that.

Alan Griffiths cũng đồng ý rằng giải pháp của Java gây ra một số vấn đề, trong đó có việc phá vỡ tính bao đóng (mà cũng không biết ông này là ông nào, có điều thấy bài viết cũng được). Nhưng ngắn gọn lại thì cũng như quan điểm của Hejlsberg—lập trình viên sớm muộn sẽ catch và throw một loạt exception Exception:

The throws clause, at least the way it’s implemented in Java, doesn’t necessarily force you to handle the exceptions, but if you don’t handle them, it forces you to acknowledge precisely which exceptions might pass through. It requires you to either catch declared exceptions or put them in your own throws clause. To work around this requirement, people do ridiculous things. For example, they decorate every method with, "throws Exception." That just completely defeats the feature, and you just made the programmer write more gobbledy gunk. That doesn’t help anybody.

Cái này mình cũng đồng ý, vì mình cũng hay làm thế cho nhanh. Vấn đề là Exception thì bao gồm cả RuntimeException, là những exception mà chúng ta không nên tự xử lí. Mình thấy tốt hơn hết là để cho lập trình viên catch những exception họ muốn/cần catch, và phần còn lại sẽ được throw tự động.

Có một lời giải thích khá thú vị cho giải pháp C# đưa ra—không hỗ trợ exception, hay chính xác hơn là không đưa ra giải pháp thực sự nào. Đó là vì họ chưa nghĩ ra.

C# is basically silent on the checked exceptions issue. Once a better solution is known—and trust me we continue to think about it—we can go back and actually put something in place. I’m a strong believer that if you don’t have anything right to say, or anything that moves the art forward, then you’d better just be completely silent and neutral, as opposed to trying to lay out a framework.

And so, when you take all of these issues, to me it just seems more thinking is needed before we put some kind of checked exceptions mechanism in place for C#. But that said, there’s certainly tremendous value in knowing what exceptions can get thrown, and having some sort of tool that checks. I don’t think we can construct hard and fast rules down to, it is either a compiler error or not. But I think we can certainly do a lot with analysis tools that detect suspicious code, including uncaught exceptions, and points out those potential holes to you.

Cũng là một lời khuyên hay. Nếu không thể làm cho tình huống tốt hơn thì hãy để nó nguyên như thế, ít nhất nó cũng sẽ không tệ đi.

Vẫn còn bảy bài phỏng vấn với ông trùm ngôn ngữ lập trình này, phải ráng đọc cho hết.

Tags: ,
  1. Chưa có phản hồi.
  1. No trackbacks yet.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: