Series Designing a Successful Application (P1: Exception Handling)
1. Giới thiệu chung: Như chúng ta đã biết, Java có 2 loại exception cơ bản là: checked và uncheck . Ví dụ khi chúng ta viết một ứng dụng lưu trữ dữ liệu trên Android, chúng ta cần phải đảm bảo quá trình đọc/ghi tập tin diễn ra một cách suôn sẻ. IOException có thể xảy ra khi xử lý tập tin ...
1. Giới thiệu chung:
Như chúng ta đã biết, Java có 2 loại exception cơ bản là: checked và uncheck. Ví dụ khi chúng ta viết một ứng dụng lưu trữ dữ liệu trên Android, chúng ta cần phải đảm bảo quá trình đọc/ghi tập tin diễn ra một cách suôn sẻ. IOException có thể xảy ra khi xử lý tập tin được coi là “checked exception”, điều này có nghĩa là chúng ta cần phải kiểm tra exception hay nói cách khác là có mệnh đề try-catch trong method đọc/ghi tập tin hoặc có mệnh đề throws trong định nghĩa method. Theo luật chung, chúng ta cần ghi nhớ:
Throwble là lớp cha của cây phân cấp throwable. Exception, và tất cả các lớp con (ngoại trừ RuntimeException với các lớp con) đều là checked. Còn lại là unchecked.
Điều này có nghĩa Error và các lớp con đều là uncheck, xem hình minh họa:
2. Bắt exception ở đâu?
Thông thường, để xử lý các checked exception, chúng ta thường viết code trong mệnh đề try-catch. Đối với đoạn code để sử dụng nhiều lần (các thư viện hoặc trong các đa ứng dụng) chúng ta không nên làm việc xử lý lỗi mà nên sử dụng phương pháp exception translation – chuyển đổi exception đặc trưng (thường là checked) thành exception chung (unchecked). Ví dụ về exception translation:
public class ExceptionTranslation { public String readTheFile(String f) { try (BufferedReader is = new BufferedReader(new FileReader(f))) { String line = is.readLine(); return line; } catch (FileNotFoundException fnf) { throw new RuntimeException("Could not open file " + f, fnf); } catch (IOException ex) { throw new RuntimeException("Problem reading file " + f, ex); } } }
- Chúng ta có thể thêm mệnh đề finally để đóng file:
} finally { if (is != null) { try { is.close(); } catch(IOException grr) { throw new RuntimeException("Error on close of " + f, grr); } } } }
- Giải thích cách sử dụng checked exception lộn xộn trong đoạn code trên: is.close() lỗi là điều khó xảy ra, tuy nhiên vì chúng ta muốn có mệnh đề finally để chắc chắn rằng không có lỗi xảy ra, nên mệnh đề try-catch được thêm vào. Điều này chỉ ra rằng nên tránh sử dụng checked exception trong các API mới và nên tận dụng unchecked exception.
3. Làm gì với exception?
Các exception cần được xử lý một cách triệt để và đối với Android, chúng ta có thể hiện thị exception thông qua Dialog hoặc Toast. Việc sử exception trên điện thoại sẽ khác với trên máy tính. Người dùng có thể đang lái xe, điều khiển máy móc hoặc đăng tương tác với người khác, và việc chúng ta không nên gây phiền phức bằng các exception. Nên nhớ rằng Toast chỉ hiện thỉ trong vài giây, nếu người dùng cần làm gì đó để xác nhận, chúng ta nên sửa dụng Dialog. Toast sử dụng để hiển thị thông tin không quan trọng, Dialog hiển thị thông tin quan trọng và yêu cầu người dùng xác nhận.