假设我们正在编写一个 Java 库,它提供了一些 I/O 实用功能,例如,一种将文本文件读取为字符串的便捷方法:
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;
}
}
此代码使用 ISO-8859-1 编码将文本文件读入字符串并将字符串返回给用户。
当不支持指定的编码时,String(byte[], String)
构造函数会抛出异常。UnsupportedEncodingException
但是,正如我们所知,ISO-8859-1
必须由 JRE 支持,如此处所述(参见标准字符集部分)。
因此,我们期望区块
catch (UnsupportedEncodingException e) {
log.fatal("encoding is unsupported", e);
// ???
}
如果 JRE 分发符合标准,则永远不会达到。
但如果没有呢?如何以最正确的方式处理此异常?问题是,如何正确警告此类错误?
建议是:
- 抛出某种
RuntimeException
. - 不要在生产代码中禁用记录器,在日志中写入异常详细信息并忽略它。
- 把
assert false
它放在这里,所以如果用户使用-ea
. AssertionError
手动抛出一个。- 添加一个
UnsupportedEncodingException
in 方法声明并允许用户选择。不是很方便,我想。 - 打电话
System.exit(1)
。
谢谢。