Giả sử chúng ta đang viết một thư viện Java, cung cấp một số chức năng I/O ulitity, ví dụ, một phương pháp thuận tiện để đọc các file văn bản như Strings:Tạo lỗi nghiêm trọng trong Java
public class StringReader {
private static final Logger log = LoggerFactory.getLog(StringReader.class);
/**
* Returns the contents of file <b>fileName</b> as String.
* @param fileName file name to read
* @return null on IO error
*/
public static String readString(String fileName) {
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName);
byte[] data = new byte[fis.available()];
fis.read(data);
return new String(data, "ISO-8859-1"); // may throw UnsupportedEncodingException!
} catch (IOException e) {
log.error("unable to read file", e);
} catch (UnsupportedEncodingException e) {
log.fatal("JRE does not support ISO-8859-1!", e);
// ???
} finally {
closeQuiet(fis);
}
return null;
}
}
Mã này đọc một văn bản tập tin vào một String sử dụng mã hóa ISO-8859-1 và trả về String cho người dùng.
Nhà xây dựng String(byte[], String)
ném một số UnsupportedEncodingException
khi mã hóa được chỉ định không được hỗ trợ. Nhưng, như chúng ta biết, ISO-8859-1
phải được JRE hỗ trợ, như đã nói here (see the Standard charsets section).
Do đó, chúng tôi kỳ vọng khối
catch (UnsupportedEncodingException e) {
log.fatal("encoding is unsupported", e);
// ???
}
không bao giờ đạt được nếu phân phối JRE phù hợp với tiêu chuẩn.
Nhưng điều gì sẽ xảy ra nếu không? Làm thế nào để xử lý ngoại lệ này một cách chính xác nhất? Câu hỏi đặt ra là, cách cảnh báo đúng về lỗi như vậy?
Những gợi ý là:
- Ném một số loại
RuntimeException
. - Không tắt trình ghi nhật ký trong mã sản xuất, viết chi tiết ngoại lệ trong nhật ký và bỏ qua nó.
- Đặt
assert false
tại đây, do đó, nó tạo AssertionError nếu người dùng khởi chạy VM với-ea
. - Ném
AssertionError
theo cách thủ công. - Thêm
UnsupportedEncodingException
vào khai báo phương pháp và cho phép người dùng chọn. Không phải rất thuận tiện, tôi nghĩ vậy. - Gọi
System.exit(1)
.
Cảm ơn.
Tôi muốn cung cấp +1 một lần cho mỗi đoạn trong câu trả lời này. –