web-dev-qa-db-fra.com

Pourquoi les exceptions «Bonehead» ne doivent-elles pas être attrapées, en particulier dans le code du serveur?

Je suis confus parce que dans quelques endroits, je l'ai déjà lu que les soi-disant " exceptions " Boneheaded (celles qui résultent de bogues dans le code) ne sont pas censés être pris. Au lieu de cela, ils doivent être autorisés à planter l'application:

Au moins deux des trois personnes ci-dessus sont des autorités établies.

Je suis surpris. Surtout pour certains (importants!) Utilisez des cas, comme le code côté serveur, je ne vois tout simplement pas pourquoi attrape une telle exception sous-optimale et pourquoi la demande doit être autorisée à se bloquer.

Pour autant que je sache, la solution typique dans ce cas est d'attraper l'exception, le retour HTTP 500 au client, ont un système automatique qui envoie un e-mail d'urgence à l'équipe de développement afin qu'ils puissent résoudre le problème Dès que possible - mais ne pas crash de l'application (une demande doit échouer, il n'y a rien que nous puissions faire ici, mais pourquoi prendre tout le service et faire tout le monde Impossible d'utiliser notre site Web? L'arrêt est coûteux!). Suis-je incorrect?

Pourquoi je demande - je tente perpétuellement de terminer un projet de passe-temps, qui est un jeu basé sur le navigateur dans le noyau .NET. Pour autant que je sache, dans de nombreux cas, le cadre fait pour moi de la boîte la chose précise Eric Lippert et Stephen Cleary recommandent contre! - qui est, en cas de manipulation d'une demande lancers francs, le cadre attire automatiquement l'exception et empêche le serveur de tomber en panne. Dans quelques endroits, cependant, le cadre ne fait pas cela. Dans de tels endroits, j'enveloppe mon propre code avec try {...} catch {...} Pour attraper toutes les exceptions "Boneheaded" possibles.

Un de ces endroits, Afaik, est des tâches d'arrière-plan. Par exemple, je suis en voie de réaliser un service de compensation d'interdiction de fond qui est censé effacer toutes les interdictions temporaires expirés toutes les quelques minutes. Ici, j'utilise même quelques couches de blocs tout capturant try:

try // prevent server from crashing if boneheaded exception occurs here
{
    var expiredBans = GetExpiredBans();
    foreach(var ban in expiredBans)
    {
        try // If removing one ban fails, eg because of a boneheaded problem, 
        {   // still try to remove other bans
            RemoveBan(ban);
        }
        catch
        {

        }
    }
}
catch
{

}

(Oui, mes catch blocks sont vides en ce moment - je suis conscient que l'ignorer ces exceptions est inacceptable, l'ajout de la journalisation est perpétuellement sur ma liste de TODO)

Après avoir lu les articles que j'ai liés ci-dessus, je ne peux plus continuer à le faire sans un doute sérieux ... je ne me tire-t-il pas à pied? Pourquoi pourquoi pas?

Si et pourquoi les exceptions\\\\uées ne doivent-elles jamais être attrapées?

105
gaazkam

Vous devez envisager la raison/but de manipuler une exception, telle que:

  • Effectuer une sorte d'action corrective ou de récupération afin que l'application puisse se poursuivre de manière significative; Cela implique que l'exception et ses conséquences sont bien comprises
  • Effectuer une sorte de nettoyage afin que l'application soit restaurée à un état cohérent; Encore une fois, les conséquences de l'exception doivent être entièrement comprises
  • Pour capturer des informations sur l'exception pour l'enregistrement et l'analyse ultérieure
  • Pour échouer gracieusement, de manière à émettre une sorte de message convivial/utilisateur utile dans une interface utilisateur de l'utilisateur appropriée au lieu de tout message ou code brut est signalé directement à l'exception; Ce faisant, il est généralement sage de capturer les détails plus techniques d'analyse par l'équipe de développement.

S'il n'y a pas de but utile servi par votre gestionnaire d'exception, un gestionnaire ne devrait pas être là et l'exception devrait être autorisée à "bulles up".

Les exceptions "Bonehead" impliquent des conditions qui n'ont pas été anticipées lorsque l'application a été initialement codée. Les exceptions non attendues devraient avoir autant de détails capturées que possible afin que la cause puisse être déterminée et des actions appropriées prises. Cela peut être fait automatiquement par le cadre de programmation; Si tel est le cas, vous ne voudrez peut-être pas les gérer explicitement.

0
Zenilogix