Je construis une application Web standard 3-Tier ASP.NET, mais j'ai du mal à faire certaines choses - spécifiquement de manipuler des exceptions. P>
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. P>
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. P>
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. P>
merci p>
4 Réponses :
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. P>
-krip p>
Cheers pour le commentaire Krip, gardera cela à l'esprit pour ces situations
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. P>
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. p>
Dans votre niveau de données, vous utiliseriez les modèles standard (par exemple, le Si vous avez besoin de "nettoyer" des trucs avant de laisser des exceptions, vous pouvez toujours utiliser un Je ne connais aucun exemples de petits sites Web conçus pour mettre en évidence une bonne manipulation des exceptions, désolé. P> à l'aide de code> instruction
pour iDisposables tels que la SQLConnection), les exceptions de document que vous savent em> 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. P>
Enfin code> Block
pour nettoyer. Vous n'êtes pas obligé de attraper code> afin d'utiliser un
enfin code> bloc. P>
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 code>.
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.
Il n'y a pas de réponses ou de modèles faciles qui assureront le succès. Tout comme votre stratégie EM> Validation em>, 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: p>
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 i>, 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 B>) Récupérer / réagir / peut-être réussir, ou si ( B 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.
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: P>