Pourquoi ne puis-je pas écrire un essai avec un pas de capture ou enfin?
Parfois je le fais et j'ai vu d'autres le faire aussi:
VB:
Try
DontWannaCatchIt()
Catch
End Try
C#:
try
{
DontWannaCatchIt();
}
catch {}
Je sais que je dois attraper tous les une exception importante que j'attends et de faire quelque chose, mais parfois, il n'est pas important - ou suis-je en train de faire quelque chose de mal?
Est cette utilisation de la try
bloc incorrect, et l'exigence d'au moins un catch
ou finally
bloquer une indication de celui-ci?
Mise à jour:
Je comprends maintenant la raison pour cela, et c'est que je devrais au moins un commentaire sur le vide d'un bloc catch, donc les autres à comprendre pourquoi elle est vide. Je dois aussi attraper les exceptions que je suis attendu.
Heureusement pour moi, je code en VB donc je peux l'écrire en un seul hic:
Catch ex As Exception When TypeOf ex Is IOException _
OrElse TypeOf ex Is ArgumentException _
OrElse TypeOf ex Is NotSupportedException _
OrElse TypeOf ex Is SecurityException _
OrElse TypeOf ex Is UnauthorizedAccessException
'I don't actually care.
End Try
- Non, je l'ai déjà dit, je sais que je dois attraper tous les une exception importante, je vais le faire plus audacieux car il n'est pas assez lisible pour vous.
- Pouvez-vous donner un exemple où vous considérez une exception "pas suffisamment important pour être pris"? Probablement, il est de votre faute.
- La capture de tous les une exception importante est une mauvais idée. Vous seul hic de ce que vous pouvez gérer, sinon votre demande doit mourir horriblement et de laisser savoir à quelqu'un qu'il est mort afin que le programmeur peut le fixer.
- édité parce que c'est toujours pas ce que j'ai signifié, ma faute.
- Maintenant que vous avez modifié, où est la question? La capture des erreurs importantes que vous pouvez rencontrer comme IO problèmes que vous voulez avaler signifie que vous devez les spécifier, et c# a parfaitement bien la syntaxe de cette.
- Je ne veux pas faire n'importe quoi avec une exception dans ce cas, j'utilise donc un vide bloc catch. La question est de savoir pourquoi un vide bloc catch au lieu de seulement un bloc try sans crochet? Mais maintenant, je commence à penser que je devrais au moins mettre des commentaires sur elle.
Vous devez vous connecter pour publier un commentaire.
Si vous ne voulez pas de l'attraper, pourquoi êtes-vous à l'aide de
try
en premier lieu?Un
try
instruction signifie que vous croyez que quelque chose peut aller mal, et lecatch
dit que vous pouvez gérer correctement ce qui va mal.Dans votre estimation:
Prises qui avale toutes les exceptions qui se produisent. Etes-vous confiant dans votre code que vous pouvez gérer rien qui va mal avec grâce?
La meilleure chose à faire (pour la fois de vous et de votre maintenance du programmeur santé mentale) est explicitement état de ce que vous pouvez gérer gracieusement:
Try
bloc, c'est ok pour l'ignorer, parce qu'il n'a rien dans le programme du flux. Cela signifie que peu importe ce qui se passe dans le bloc try, même dans la pire hypothèse, il ne sera pas question pour le reste du programme.catch (Exception){}
et pourquoi vous pensez que vous pouvez gérer toutes les exceptions qui obtient jeté. Je dois vous dire, si j'ai vu que dans un autre programmeur du code, ma première pensée serait, "Oh Merde."Non, vous devriez pas attraper tous les une exception importante. Il est correct de les attraper et de les ignorer les exceptions qui ne vous intéressent pas, comme un I/O erreur si il n'y a rien que vous pouvez faire pour corriger cela, et vous ne voulez pas la peine de les signaler à l'utilisateur.
Mais vous avez besoin de laisser des exceptions comme le
StackOverflowException
etOutOfMemoryException
propager. Ou, plus communément,NullReferenceException
. Ces exceptions sont généralement des erreurs que vous n'avez pas anticiper, ne peut pas récupérer de, ne devrait pas récupérer à partir de, et ne doivent pas être supprimés.Si vous souhaitez ignorer une exception, alors il est bonne d'écrire explicitement un vide bloc catch dans le code de l'exception. Ceci permet de préciser exactement quelles sont les exceptions que vous êtes ignorant. Ignorant les exceptions très correctement est une procédure d'adhésion, pas d'un " opt-out un. Avoir un "ignorer toutes les exceptions" fonctionnalité qui peut ensuite être substituée à ne pas ignorer certains types serait une très mauvaise fonctionnalité du langage.
Comment savez-vous quels types d'exceptions sont importants et ne doivent pas être pris? Que faire si il y a des exceptions que vous ne connaissez pas? Comment savez-vous que vous ne finirez pas la suppression des erreurs importantes vous n'êtes pas familier avec?
throw
pasthrow exception
afin de préserver les détails de la pile msdn.microsoft.com/en-us/library/ms182363(SV.80).aspxAussi, si vous n'avez pas à faire quelque chose à propos d'une erreur peut-être vous devez spécifier quel type d'exception, le programme a ignorer.
Si vous avez d'ignorer tous les une exception, je ne vois pas pourquoi vous ne pouvez pas utiliser try/catch de cette façon.
ImportantExeption
.C'est généralement une erreur. Exceptions signal, eh bien, exceptionnelle comportement; lorsqu'une exception est lancée, il devrait signifier que quelque chose n'allait pas. Donc, pour poursuivre flux de programme normal, comme si rien ne s'est mal passé est une façon de cacher une erreur, une forme de déni. Au lieu de cela, pensez à comment votre code doit gérer le cas exceptionnel, et d'écrire le code pour que cela se produise. Une erreur qui se propage parce que vous avez couverts il est beaucoup plus difficile à déboguer que les surfaces immédiatement.
Pas de capture ou, enfin, n'est pas valide. Vide de capture ou enfin est valide. Vide attraper signifie que vous ne vous souciez pas des exceptions, vous essayez juste de faire quelque chose et ce n'est pas grave si ça ne fonctionne pas, vous voulez juste pour aller sur. Utile pour le nettoyage des fonctions par exemple.
Il n'est pas facile pour vous de le faire parce que c'est considéré comme une mauvaise pratique par la majorité des développeurs.
Ce que si quelqu'un, plus tard, ajoute un appel de méthode pour le corps de
DontWannaCatchIt()
que ne lever une exception en vaut la capture, mais il est avalé par votre vide bloc catch? Que faire si il y a des exceptions que vous avez vraiment envie de l'attraper, mais ne le savais pas à l'époque?Si vous devez absolument le faire, essayez d'être aussi précis que possible avec le type de l'exception que vous allez attraper. Si non, peut-être l'enregistrement de l'exception est une option.
LogBenchmark
, je ne vous attendez pas à quiconque de code multithread jeu de la vie sur elle.Une erreur existe, a été lancée, et doit aller quelque part. Normal flux de code a été abandonnée et le ventilateur besoins nettoyé.
Aucun bloc catch = état indéterminé. Où le code devrait-il aller? Que doit-elle faire?
Un vide bloc catch = erreur traitées en l'ignorant.
Remarque: VBA a une vile "Sur l'Erreur de Continuer"...
On Error Continue
presque tout le temps.La raison pour laquelle j'ai entendu, c'est que si votre essaient échoue pour une raison QUELCONQUE, vous donnant le contrôle de la réponse d'erreur est très préférable de donner le Cadre de contrôle de celui-ci, c'est à dire, le jaune de l'écran ou de l'erreur 500.
que si vous écrivez uniquement code avec essayer
ce serait équivalente à écrire
donc écrit essayer n'a aucun sens , il ne augmenter votre nombre de lignes.
maintenant, si vous écrivez essayer avec vide de capture ou enfin , vous êtes explicitley demandant d'exécution à se comporter différemment.
de sorte que " pourquoi je pense que vide bloc try n'est pas possible.
Oui, il est incorrect. C'est comme
goto
: un par 100 KLoc est bien, mais si vous avez besoin de nombreuses de ces, vous de faire le mal.Avaler des exceptions sans aucune réaction, est l'une des pires choses dans la gestion des erreurs, et il devrait au moins être explicite:
Le plus loin-loin-look:
La gestion des erreurs est un aspect: dans certains contextes, une erreur doit être jeté et propagée vers le haut de la pile d'appel (par exemple, la copie d'un fichier, copie échoue).
Appelant le même code dans un autre contexte, peut exiger de l'erreur de suivi, mais l'opération de continuer (par exemple, la Copie de 100 fichiers, avec un registre indiquant les fichiers qui ont échoué).
Même dans ce cas, un vide gestionnaire catch est faux.
Avec la plupart des langues, il n'y a pas d'autre mise en œuvre directe que d'essayer+prise à l'intérieur de la boucle, et de construire le journal dans le gestionnaire catch. (Vous pourriez construire d'une manière plus flexible mécanisme, mais: Ont par appel-fil gestionnaire qui peut jeter, ou de ranger le message. Cependant, l'interaction avec les outils de débogage souffre sans direct de la langue.)
Une utilisation raisonnable serait le cas de la mise en œuvre d'un
TryX()
à partir d'unX()
, mais qui aurait pour revenir à l'exception en question.