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?
Vous devez envisager la raison/but de manipuler une exception, telle que:
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.