Załóżmy piszemy biblioteki Java, która zapewnia pewne funkcje I/O ulitity na przykład wygodny sposób odczytać pliki tekstowe jako ciągi:Generowanie fatalny błąd w Javie
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;
}
}
Ten kod odczytuje tekst plik do String za pomocą kodowania ISO-8859-1 i zwraca String do użytkownika.
Konstruktor String(byte[], String)
wysyła UnsupportedEncodingException
, gdy określone kodowanie nie jest obsługiwane. Ale, jak wiadomo, ISO-8859-1
musi być wspierany przez środowisko JRE, jak powiedział here (see the Standard charsets section).
Stąd oczekujemy blok
catch (UnsupportedEncodingException e) {
log.fatal("encoding is unsupported", e);
// ???
}
nigdy nie zostanie osiągnięty, jeśli dystrybucja JRE jest zgodny ze standardem.
Ale co, jeśli nie? Jak obsługiwać ten wyjątek w najbardziej poprawny sposób? Pytanie brzmi, jak prawidłowo powiadomić o takim błędzie?
sugestie są:
- Rzut jakiś
RuntimeException
. - Nie należy wyłączać rejestratora w kodzie produkcyjnym, wpisywać w dzienniku szczegółów wyjątku i ignorować go.
- Umieść tutaj kod
assert false
, aby utworzyć AssertionError, jeśli użytkownik uruchomił maszynę wirtualną pod numerem-ea
. - Wyrzuć ręcznie
AssertionError
. - Dodaj
UnsupportedEncodingException
w deklaracji metody i pozwól użytkownikowi wybrać. Niezbyt wygodne, jak sądzę. - Zadzwoń pod
System.exit(1)
.
Dzięki.
Chciałbym dać +1 raz dla każdego akapitu w tej odpowiedzi. –