6
votes

L'exception .NET n'est pas attrapée

J'ai une fonction qui ressemble à ceci: xxx

_dbmanager utilise LINQ pour insérer des données dans une base de données SQL. Hier, la machine qui héberge la base de données a manqué d'espace disque et mon programme s'est écrasé. J'ai eu une décharge de crash qui montre qu'il y avait un sqlclient.sqxception avec un message d'exception lisant quelque chose comme "le journal de transaction de base de données est plein ...".

Ma question est la suivante: Pourquoi l'exception n'a-t-elle pas été prise dans le bloc de capture ci-dessus? La chose étrange est que lorsque j'ai essayé de reproduire la question, je pourrais avoir la même exception, mais il a été attrapé par le bloc de capture. Qu'est-ce qui pourrait être le problème?

Deuxièmement, question connexe: Imaginez si nous utilisons une bibliothèque tierce et que nous ne voulons aucune exception lancée. Nous pouvons utiliser un bloc d'essais, mais cela ne fonctionne que sur le fil d'appel. Et si la tierce partie démarre de nouveau thread et une exception est levée là-bas? Y a-t-il un moyen de gérer cela? Je sais que je peux enregistrer notre non andhandexceptionHandler , mais cela semble être différent de ce que je voulais.


4 commentaires

L'enregistrement de la CATCH STATEMNEMT était-il enregistré sur le serveur qui avait été sorti de l'espace disque, par une chance? Avez-vous une méthode de sauvegarde pour enregistrer une erreur dans le mécanisme de journalisation? Par exemple, notre pratique générale consiste à utiliser une structure imbriquée pour tenter de vous connecter d'abord à notre base de données mondiale de traitement des erreurs, puis au journal des événements, puis à un courrier électronique.


La partie forestière n'a pas été atteinte du tout lorsque le crash s'est produit. Il s'est écrasé à l'intérieur de _dbmanager.inserSearch (). BTW, nous utilisons MSEL Logging Application Block et la configurée pour vous connecter en utilisant une méthode différente.


et aucune de la méthode ne se connectera à cette machine SQL Server


Un peu inutile de ne pas poster la trace de la pile que vous avez. Si vous ne passez pas alors vos efforts sur la mise en œuvre de AppDomain.UnhandledException.


3 Réponses :


6
votes

Ma question est la suivante: pourquoi l'exception n'a-t-elle pas été prise dans le bloc de capture ci-dessus?

comme David Stratton suggère, le système aurait pu être hors de l'espace disque et ne pas pouvoir écrire sur le journal déposer. Il y a aussi une chance que le processus soit terminé dû à exception de l'état corrompu Cela ne sera pas livré à votre capture-tout en .NET 4. L'exception que le processus terminé peut également avoir été jeté du fil qui n'avait pas de capture.

second, question connexe: imaginez si nous utilisons une bibliothèque tierce partie et Nous ne voulons pas Toute exception lancée.

Je pense que vous devrez arrêter ici et repenser. Ce que vous dites est que vous êtes absolument à 100% sûr que rien ne puisse jamais se tromper dans la bibliothèque tierce. Il existe certaines exceptions (comme OutofMemoryException ) que vous ne devriez pas saisir car votre code ne sait tout simplement pas comment se remettre d'eux. La règle de gézanne avec la manipulation des exceptions est que vous devriez attraper uniquement les exceptions que vous comprenez parfaitement et savez comment récupérer de . S'il vous plaît jeter un oeil à cette Répondre et les liens dedans. < / p>

Et si la tierce partie commence un nouveau thread et une exception est lancée là? Y a-t-il un moyen de gérer cela?

Le meilleur moyen de gérer cela est de s'appuyer sur la stratégie CLR par défaut qui résiliera votre demande. La seule chose raisonnable que vous puissiez faire est essayer pour la connecter en vous abonnant à AppDomain.unhandleXception .


2 commentaires

Tout d'abord, merci pour votre réponse. Très bel article sur Seh. Donc, si une exception d'état corrompue soulevée, cela sera montré dans une pile d'appels de décharge de crash? Parce que je n'ai vu que la sqlexception dans une décharge de crash.


De plus, aucune des méthodes de journalisation que j'ai utilisées ne vous connaîtrait à ce serveur SQL.



0
votes

est-il possible qu'il y ait un autre try / attraper bloc à l'intérieur de cette méthode inserSearch , qui conditionnelle jette instruction.

La mise en œuvre de la classe "dbmanager", a choisi de ne pas lancer au cas où il n'y a pas assez d'espace pour écrire sur le disque. Juste une pensée.


0 commentaires

0
votes

Si vous utilisez les contrats de code Runtime Vérification, je vous conseille de vérifier la version compilée de votre DLL. Lisez ceci pour plus de détails Pourquoi .Net Exception n'est pas attrapé?


0 commentaires