Java de los fundamentos al dominio — Lección 7
Manejo de fallas con excepciones y prueba con recursos
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
Los valores de archivos, redes y entradas pueden fallar en cualquier momento. La sintaxis de administración de recursos y excepciones de Java se utiliza para propagar fallas y cerrar recursos en cualquier ruta.
Pasar excepciones
public Settings loadSettings(Path path) throws IOException {
String json = Files.readString(path);
return parser.parse(json);
}
No fuerce que una excepción se oculte internamente si la persona que llama debe decidir cómo recuperarse. Al agregar contexto, debe conservar la excepción original como causa.
try {
settings = loadSettings(path);
} catch (IOException error) {
logger.warn("settings load failed", error);
settings = Settings.defaults();
}
Detecte únicamente las excepciones que se puedan manejar. Si detecta todas las excepciones y no hace nada, incluso los errores reales pueden continuar con normalidad.
try-with-resources
public List<String> readLines(Path path) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(path)) {
return reader.lines().toList();
}
}
Si crea un objeto que implementa AutoCloseable entre paréntesis, se llamará a cerrar al final del bloque. Los identificadores de archivos se limpian tanto en las rutas de retorno normales como en las de excepción.
Excepciones comprobadas y excepciones de tiempo de ejecución.
Las excepciones marcadas revelan si se manejan mediante declaración de método o captura. Las excepciones de tiempo de ejecución como IllegalArgumentException se utilizan a menudo para contratos de llamadas no válidos o errores de programación.
Cuál de los dos no es necesariamente mejor, pero el criterio es si se trata de un fallo del que la persona que llama puede recuperarse.
Reemplazar después de completar el estado.
Settings loaded = loadSettings(path);
currentSettings = loaded;
Si crea completamente un valor nuevo y lo ingresa en el campo, la configuración existente se mantendrá incluso si falla la carga. El diseño de excepciones no se trata de crear muchas capturas, sino de determinar cómo permanecen los recursos y el estado del objeto en caso de falla.