regresar a la lección

Finally o solo el código?

importancia: 5

Compara los dos fragmentos de código.

  1. El primero usa finally para ejecutar el código después de try..catch:

    try {
      trabajo trabajo
    } catch (e) {
      maneja errores
    } finally {
      limpiar el espacio de trabajo
    }
  2. El segundo fragmento coloca la limpieza justo después de try..catch:

    try {
      trabajo trabajo
    } catch (e) {
      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 (e) {
    /// ...
  } 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 (e) {
    // ...
    if("no puede manejar el error") {
      throw e;
    }

  } 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.