La meilleure pratique est que la gestion des exceptions ne doit jamais cacher les problèmes. Cela signifie qu' try-catch
blocs doivent être extrêmement rares.
Il y a 3 circonstances qui ont été à l'aide d'un try-catch
de sens.
Toujours traiter connu des exceptions aussi bas que vous le pouvez. Toutefois, si vous attendez une exception, il est généralement préférable de tester d'abord. Par exemple, l'analyse, la mise en forme et à l'arithmétique, les exceptions sont presque toujours mieux traités par la logique de contrôle, plutôt que spécifique try-catch
.
Si vous avez besoin de faire quelque chose sur une exception (par exemple, l'exploitation forestière ou d'annuler une transaction) puis re-lancer l'exception.
Toujours traiter avec des inconnus exceptions près aussi haut que vous le pouvez - et le seul code, qui doit consommer une exception et ne pas re-jeter, il devrait être l'INTERFACE ou API publique.
Supposons que vous vous connectez à un API à distance, ici, vous savez à s'attendre à certaines erreurs (et avoir des choses dans ces circonstances), c'est donc le cas 1:
try
{
remoteApi.Connect()
}
catch(ApiConnectionSecurityException ex)
{
// User's security details have expired
return false;
}
return true;
Notez qu'aucun d'autres exceptions sont pris, comme ils ne sont pas attendus.
Maintenant, supposons que vous essayez de sauver quelque chose à la base de données. Nous avons à le restaurer en cas de panne, nous avons donc affaire 2:
try
{
DBConnection.Save();
}
catch
{
// Roll back the DB changes so they aren't corrupted on ANY exception
DBConnection.Rollback();
// Re-throw the exception, it's critical that the user knows that it failed to save
throw;
}
Notez que nous avons re-lancer l'exception - le code plus haut, faut quand même savoir que quelque chose a échoué.
Enfin, nous avons de l'INTERFACE utilisateur - ici, nous ne voulons pas complètement les exceptions non gérées, mais nous ne voulons pas de les cacher. Nous avons ici un exemple de cas 3:
try
{
// Do something
}
catch(Exception ex)
{
// Log exception for developers
WriteException2LogFile(ex);
// Display message to users
DisplayWarningBox("An error has occurred, please contact support!");
}
Cependant, la plupart des API ou des cadres de l'INTERFACE utilisateur ont générique façons de faire de cas 3. Par exemple ASP.Net a un jaune d'erreur de l'écran qui vide les détails de l'exception, mais qui peut être remplacé avec un message générique dans l'environnement de production. A la suite de ces est la meilleure pratique car il vous permet d'économiser beaucoup de code, mais aussi parce que l'erreur de l'enregistrement et l'affichage devrait être la configuration des décisions plutôt que de codé en dur.
Tout cela signifie que le cas 1 (connu des exceptions) et le 3 (one-off de l'INTERFACE utilisateur de manutention), les deux ont de meilleures habitudes (éviter l'erreur ou de la main d'erreur de manipulation hors de l'INTERFACE utilisateur).
Même cas 2 peut être remplacé par de meilleures habitudes, par exemple de transaction étendues (using
blocs de restauration toute transaction engagés au cours de l') bloc de rendre plus difficile pour les développeurs pour obtenir la meilleure pratique pattern de mal.
Par exemple, supposons que vous avez une grande échelle ASP.Net application. La journalisation des erreurs peut-être par l'intermédiaire de ELMAH, erreur d'affichage peut être instructif YSoD localement et une belle localisée message dans la production. Connexions de base de données peuvent tous être via la transaction et des étendues using
blocs. Vous n'avez pas besoin d'un seul try-catch
bloc.
TL;DR: la Meilleure pratique est en fait de ne pas utiliser try-catch
blocs.