7
votes

Comment attraper une sqlexception lancée par RaisError appelée dans un déclencheur défini par l'entité Framework 4?

J'ai un cadre d'entité configuré pour mettre à jour une table. La mise à jour est interceptée par un contrat de déclenchement, qui appelle Raiserror: xxx

dans ma classe de référentiel, je tente d'attraper la sqlexception générée par le RaisError dans SQL: xxx

Le problème est que c # ne attrape pas la sqlexception; Il est transmis à l'appelant comme une exception non gérée ("SQLException n'a pas été non géré par l'utilisateur: Erreur de test de SQL"). Quoi?!

On dirait que les savechanges () de EF transmettent en quelque sorte à l'exception sur mon tryotry. J'ai essayé de changer de déclaration de capture pour attraper (exception EX) au cas où l'exception EF est d'une manière ou d'une autre plus générale, mais je reçois toujours une sqlexception non manquée. Est-ce que je manque quelque chose de simple ici? Quel est le problème avec la méthode SAVECHANGES ()?


2 commentaires

Essayez avec une capture vide juste pour voir ce qui se passe


Il semble dans cette situation que 2 exceptions sont montrées lors du mode de débogage en mode Visual Studio: le premier est un "system.data.sqlclient.sqxception" qui n'est pas attrapé par aucun type ". déclaration. La seconde est une "système.data.entity.infrastructructure.dbupdateException" qui est capturée par .NET et contient le premier comme l'Innexception. Cependant, seuls les derniers causent .net à crash - le premier est ignoré. Pourrait-il être que le premier provient d'un processus extérieur, comme SQL Server?


4 Réponses :


0
votes

La seule façon dont je sais avoir une exception en évitant une prise d'essai est d'avoir l'exception dans un fil différent. Le code EF pourrait-il être exécuté sur un fil différent? Peut-être que vous pouvez activer l'exception lancer sur une chance de 1º à la boîte de dialogue Exceptions.


0 commentaires

1
votes

J'ai essayé presque exactement le même déclencheur que vous avez sur une table et essayé d'enregistrer l'objet correspondant (nouveau) dans le cadre de l'entité. D'après ce que je peux voir, l'exception étant lancée est de type system.data.updateException et non sqlexception. L'exception interne est la sqlexception et contient le message personnalisé que vous avez soulevé dans la gâchette qui est «Erreur de test de SQL». J'espère que cela aide


1 commentaires

Merci. Le problème est que je ne peux pas attraper l'exception même avec le type d'exception le plus élémentaire, donc je ne peux pas pouvoir creuser et comprendre quel type il est. Que voulez-vous dire "de ce que vous pouvez voir"?



0
votes

J'ai eu ce problème exact.

J'utilisais MVC Mini Profiler pour profiler les temps de la requête. J'ai constaté que si je l'ai retiré de mon projet, les exceptions ont été attrapées comme on m'y attendait.


0 commentaires

1
votes

Il y a 2 choses: -

  1. Si vous voulez que RaisError jette une sqlexception, vous devez définir sa gravité supérieure à 10. Les erreurs avec une gravité de 10 et moins sont informatives et ne jettent donc pas d'exceptions.

  2. attrape de captureException ou définir un point d'arrêt dans le bloc de capture de l'exception générale. Dans la fenêtre immédiate, inspectez le type d'exception: ex.getType ();


0 commentaires