7
votes

Comment et où gérer des exceptions dans une application Web à 3 niveaux? Exceptions de base de données SQL spécifiquement

Je construis une application Web standard 3-Tier ASP.NET, mais j'ai du mal à faire certaines choses - spécifiquement de manipuler des exceptions.

J'ai essayé de jeter un coup d'œil sur le Web pour quelques exemples, mais que vous ne trouvez aucun autre que tout aillent un projet montrant comment tout se lie ensemble.

Dans mon niveau de données, je me connecte à SQL Server et à faire quelques affaires. Je sais que j'ai besoin d'attraper des exceptions qui pourraient être soulevées en conséquence, mais je ne sais pas où le faire.

De ce que j'ai lu, je devrais le faire dans le niveau de l'UI, mais dans ce cas, je ne sais pas comment vous assurer que la connexion à la base de données est fermée. Est-ce que quelqu'un est capable de clarifier comment faire cela? En outre, si quelqu'un sait où je pouvais trouver un exemple d'application Web à 3 niveaux qui suit les meilleures pratiques qui seraient aussi formidables.

merci


0 commentaires

4 Réponses :


1
votes

Juste un point de côté qui peut diriger votre pensée: si vous avez un type de volume pouvant entraîner des problèmes de concurrence (impulsions), vous voudrez que votre application détecte cette erreur SQL et réessayez l'opération (par exemple, une transaction). Qui fait valoir une manipulation d'exception aux données ou aux niveaux d'entreprise.

-krip


1 commentaires

Cheers pour le commentaire Krip, gardera cela à l'esprit pour ces situations



1
votes

Je crois que sa meilleure pratique de gérer des exceptions au dernier moment responsable. Cela signifie généralement au niveau de l'interface utilisateur (c'est-à-dire le contrôleur d'une application MVC ou dans la CodeBeHind dans une application ASP.NET traditionnelle). C'est à ce niveau élevé que votre code "sait" ce que l'utilisateur demande, et ce qui doit être fait si quelque chose ne fonctionne pas.

Gestion des exceptions plus bas dans la pile d'appels entraîne généralement un code d'appel de ne pas pouvoir gérer correctement les situations exceptionnelles.

Dans votre niveau de données, vous utiliseriez les modèles standard (par exemple, le à l'aide de instruction pour iDisposables tels que la SQLConnection), les exceptions de document que vous savent peuvent se produire (ne faites pas cela pour la mémoire ou d'autres cas rares), puis laissez-les couler dans la pile d'appel quand ils le font. Au plus, vous voudrez peut-être attraper ces exceptions et les envelopper en un seul type d'exception, dans des situations où de nombreuses exceptions peuvent devoir être gérées par des appelants.

Si vous avez besoin de "nettoyer" des trucs avant de laisser des exceptions, vous pouvez toujours utiliser un Enfin Block pour nettoyer. Vous n'êtes pas obligé de attraper afin d'utiliser un enfin bloc.

Je ne connais aucun exemples de petits sites Web conçus pour mettre en évidence une bonne manipulation des exceptions, désolé.


4 commentaires

Donc, c'est bien d'attendre la collecte des ordures pour fermer la connexion en utilisant la déclaration en utilisant?


Non, vous voulez fermer la connexion (a) immédiatement lorsque vous avez terminé, ou utilisez enfin l'utilisation de la syntaxe / motif de sorte que cela se produise automatiquement. Je vais élaborer à ce sujet. . .


@nick Vérifiez le lien dans ma réponse pour le à l'aide de la déclaration .


Cheers Will, je l'ai regardé plus tôt mais j'ai manqué le peu où il est dit que cela disposera de l'objet même si une exception est surélevée - longue journée. On dirait que ceci est un motif incontournable que je vais l'utiliser à partir de maintenant.



6
votes

Il n'y a pas de réponses ou de modèles faciles qui assureront le succès. Tout comme votre stratégie Validation , votre stratégie de traitement exceptionnelle exacte est spécifique à votre situation exacte et est souvent un compromis entre le temps et l'exhaustivité. Il y a de bons conseils que nous pouvons donner cependant:

  • ne cache jamais la pile-trace; N'utilisez jamais "Rethrow" à moins de sécurité que vous souhaitez cacher ce qui s'est passé.
  • Ne sentez pas que vous avez besoin d'une erreur d'erreur de partout. Par défaut, dans vos niveaux inférieurs, laissez l'erreur réelle percolaire jusqu'au niveau supérieur n'est pas mauvaise. L'interface utilisateur / contrôleur est l'endroit où vous devez vraiment décider de réagir à quelque chose qui ne va pas.
  • à chaque point, comme vous voulez-vous faire exactement si quelque chose ne va pas. Souvent, vous ne serez pas en mesure de penser à rien de mieux que de simplement le laisser monter dans la couche supérieure ou même sur la machine cliente. (Bien que dans la production de rapports de verbose.) Si tel est le cas, laissez-le aller.
  • Assurez-vous de disposer de ressources non gérées (tout ce qui implémente Idisposable.) Votre accès aux données est un excellent exemple. ( a ) appelez .Dispose () pour votre connexion (en particulier), votre commande, votre digne d'information, etc. dans le bloc enfin ou (< Strong> B ) Utilisez le Utilisation de la syntaxe / modèle , ce qui garantit que la disposition appropriée se produit. < / li>
  • Recherchez des endroits où les erreurs sont probables et où vous pouvez rechercher certaines erreurs, réagir (en réessayant, en attendant une seconde rétrayage, essayant cette action différente, etc.), etc.) et ensuite réussir. Une grande partie de votre traitement des exceptions est de faire du succès, non seulement pour signaler bien les défaillances.
  • Dans la couche de données, vous devez considérer quoi faire si quelque chose ne va pas au milieu d'un processus en plusieurs étapes. Vous pouvez laisser l'erreur réelle percolaire, mais cette couche doit gérer les choses de rangement après une erreur. Vous voudrez parfois utiliser des transactions.
  • dans une situation asynchrone (soit (A.) en raison de plusieurs threads ou (B.), car la logique commerciale est des processus séparément sur les "tâches" et a servi ultérieurement), vous devez notamment avoir un plan pour Erreurs de journalisation.
  • Je préférerais voir "Code de traitement des erreurs" dans 25% de votre application que 100%. 100% signifie que vous vouliez probablement qu'il ressemble et que vous vous sentez comme si vous avez une manipulation des erreurs. 25% signifie que vous avez passé du temps à manipuler des exceptions où ils devaient vraiment être manipulés.

5 commentaires

Merci pour la réponse. Quelles sont vos pensées sur la manipulation des sqlexceptions? Pour les erreurs soulevées au sein de SproC, voudriez-vous les attraper sur DAL et lancer une erreur personnalisée ici ou une alternative?


Dans mon dal actuel (plus d'un outil da , que je passe dans mes objets métier qui sont également des objets demi-dals) Je sais que quelques erreurs spécifiques automatiquement (comme l'erreur de victime de l'impasse # 1205. Si je vois ça, j'essaie encore une fois.), Mais laissez la plupart des erreurs percolent. Parfois, l'objet d'affaires peut faire quelque chose de intelligent avec cette erreur; Sinon, je le laisse percoler. Dans mon Dal, je vais bientôt enregistrer automatiquement l'erreur et le texte de commande SQL et les paramètres automatiquement. J'ai envisagé d'ajouter utilement le texte SQL au message d'erreur, mais c'est une préoccupation de sécurité.


Seules les erreurs de piégeage dans vos Sprates / UDF, si vous pouvez ( A ) Récupérer / réagir / peut-être réussir, ou si ( B ), vous pouvez améliorer les informations d'erreur qui percolent. Donc, la valeur par défaut n'est pas une manipulation d'erreur dans SPROC / UDF, mais vous allez parfois ajouter une erreur d'erreur.


Encore merci pour l'aide avec cela. J'avais envisagé d'augmenter les erros définies par l'utilisateur dans mes SproCs que je tiens ensuite dans la couche DAL, puis créez et lancez une exception personnalisée pour eux, plutôt que de la standard SQLException. Peut-être que je devrais utiliser des codes de retour si dans mes Sprates pour déterminer s'il réussit ou non.


D'après ce que vous dites, je suppose que c'est la voie à suivre. Vous ne voulez pas utiliser les trappings de la manipulation des exceptions pour le flux logique. Que vous vérifiez certaines conditions ou assumez une condition particulière et soulevez des erreurs autrement, est un appel de jugement.



0
votes

Ce n'est pas une réponse spécifique à votre question, mais si vous êtes intéressé par les meilleures pratiques, je regarderais les habitudes et les pratiques de Microsoft:

Guide d'architecture d'application

applications Web Guides


0 commentaires