Finally o solo el código?
Compara los dos fragmentos de código.
-
El primero usa
finally
para ejecutar el código después detry..catch
:try { trabajo trabajo } catch (err) { maneja errores } finally { limpiar el espacio de trabajo }
-
El segundo fragmento coloca la limpieza justo después de
try..catch
:try { trabajo trabajo } catch (err) { manejo de errores } limpiar el espacio de trabajo
Definitivamente necesitamos la limpieza después del trabajo, no importa si hubo un error o no.
¿Hay alguna ventaja aquí en usar finally
o ambos fragmentos de código son iguales? Si existe tal ventaja, entonces da un ejemplo cuando sea importante.
La diferencia se hace evidente cuando miramos el código dentro de una función.
El comportamiento es diferente si hay un “salto fuera” de try..catch
.
Por ejemplo, cuando hay un return
en el interior de try..catch
. La cláusula finally
funciona en el caso de cualquier salida de try..catch
, incluso a través de la declaración return
: justo después de que try..catch
haya terminado, pero antes de que el código de llamada obtenga el control.
function f() {
try {
alert('inicio');
return "resultado";
} catch (err) {
/// ...
} finally {
alert('limpieza!');
}
}
f(); // limpieza!
… O cuando hay un throw
(lanzamiento de excepción), como aquí:
function f() {
try {
alert('inicio');
throw new Error("un error");
} catch (err) {
// ...
if("no puede manejar el error") {
throw err;
}
} finally {
alert('limpieza!')
}
}
f(); // limpieza!
Es “finally” el que garantiza la limpieza aquí. Si acabamos de poner el código al final de f
, no se ejecutará en estas situaciones.