Como en muchas cuestiones relacionadas con la programación, todo depende ...
Me parece que uno realmente debe primero tratar de definir su API casos excepcionales por lo que no pueden suceder en el primer lugar.
Usar Design By Contract puede ayudar a hacer esto. Aquí uno insertaría funciones que generan un error o falla e indican un error de programación (no error del usuario). (En algunos casos, estas comprobaciones se eliminan en el modo de lanzamiento).
Luego, mantenga excepciones para fallas genéricas que no se pueden evitar, como la conexión de DB falló, la transacción optimista falló, la escritura de disco falló.
Por lo general, no es necesario capturar estas excepciones hasta que lleguen al "usuario". Y provocará que el usuario tenga que volver a intentarlo.
Si el error es un error del usuario como un error tipográfico en un nombre o algo, entonces trate eso directamente en el código de la interfaz de la aplicación. Dado que este es un error común, necesitaría ser manejado con un mensaje de error amigable al usuario potencialmente traducido, etc.
La aplicación de capas también es útil aquí. Así que vamos a tomar el ejemplo de traslación de efectivo de una cuenta de una otra cuenta:
transferInternal(int account_id_1, int account_id_2, double amount)
{
// This is an internal function we require the client to provide us with
// valid arguments only. (No error handling done here.)
REQUIRE(accountExists(account_id_1)); // Design by contract argument checks.
REQUIRE(accountExists(account_id_2));
REQUIRE(balance(account_id_1) > amount);
... do the actual transfer work
}
string transfer(int account_id_1, int account_id_2, double amount)
{
DB.start(); // start transaction
string msg;
if (!checkAccount(account_id_1, msg)) return msg; // common checking code used from multiple operations.
if (!checkAccount(account_id_2, msg)) return msg;
if (!checkBalance(account_id_1, amount)) return msg;
transferInternal(account_id_1, account_id_2, amount);
DB.commit(); // This could fail with an exception if someone else changed the balance while this transaction was active. (Very unlikely but possible)
return "cash transfer ok";
}
En caso de "debe ser absolutamente encontrado", usaría assertion. +1 para el último párrafo. –
"no puede continuar con la ejecución del código si se producen". Usted puede. Id. La conexión de DB se pierde. El programa puede continuar y le pedirá al usuario que espere la reconexión. –
Mykola, sí, el código de USUARIO será, no el código db. por lo tanto, excepciones. –