2017-10-12 17 views
-1

Je veux remplacer le try/catch/finally bloquer ou de créer une nouvelle myTry/myCatch/bloquer myFinally avoir en interne une spécifique et « automatique » comportements. Par exemple pour enregistrer une exception, le développeur doit appeler explicitement la méthode Log (ex). =>try{...}catch(Ex ex){ **Log(ex)**; doSomething(); throw; }comment écraser ou créer une nouvelle try/catch/finally .net C#

mais si le développeur oublie d'appeler le journal (ex), rien ne se passe. Je veux créer une structure capable de faire quelque chose à l'intérieur, comme le modèle de gabarit. quelque chose comme:

MyTryWithAutomaticInternalLog { 
doSomething(); 
} 
MyCatch(Exception ex){ 
**//Internally this stores in someplace the exception** 
doSomething2(ex); 
throw; 
} 
MyFinally { 
//internally this saves how much time took the execution for example. 
doSomething3(); 
} 

Il y a d'autres options comme: 1) créer une méthode d'emballage comme MyTryWithAutomaticInternalLog(()=>{ doSomething(); }, (ex)=>{ doSomethingOnError(); },()=>{ doSomethingInfinally(); }); et à l'intérieur du MyTryWithAutomaticInternalLog avec une stratégie de modèle de modèle gérer le flux, mais encore une fois, le développeur doit se rappeler d'utiliser la méthode MyTryWithAutomaticInternalLog au lieu de la très standard try/catch/finally.

2) Évitez d'utiliser try/catch dans le code et gérer l'exception avec un motif d'injection de dépendance. Mais je veux l'éviter.

Existe-t-il d'autres options? comment puis-je écraser le bloc try/catch/finally? Si non, je vous serais reconnaissant si vous fournissez des informations techniques et des liens, car j'ai cherché sans trop de chance.

TKX

+0

Vous voulez une journalisation automatique si et seulement si l'appelant oublie de faire le sien? Ajoutez simplement la journalisation et un moyen pour l'appelant de le supprimer.Un indicateur de système de journalisation, une propriété de classe ou un paramètre facultatif à la fonction. Modifier: vous devriez également utiliser un système de journalisation si c'est un problème réel. Log4net ou autres. Ces problèmes ont été résolus beaucoup – zzxyz

Répondre

0

D'une manière générale, cross cutting concerns (validation, l'enregistrement, l'autorisation, l'audit, etc.) doivent être pris en compte sur la partie "normale" de l'application plutôt que d'essayer de "rattraper override try".

Il y a un bon article MSDN à propos Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class.

De même, vous pouvez utiliser Interception avec le même but. Il existe un article sur interception with Unity sur MSDN, mais cette fonctionnalité est également disponible sur certains autres conteneurs DI populaires.

Certains cadres d'application ont également des extensions intégrées pour les problèmes transversaux. Par exemple, ASP.NET MVC a filters qui peut être enregistré globalement, puis activé ou désactivé pour des parties spécifiques de l'application en utilisant les attributs .NET.

0

Je voudrais emballer un service avec intercepteur pour mettre en œuvre la journalisation des appels de service. Il fournira un moyen d'obtenir votre exception indépendamment de la façon dont le programmeur écrit le code de capture.

exemple est dans ma couche de service i la résolution de liaison à l'aide de l'intercepteur de journalisation.

Cette URL vous donnera un coup de coude dans une direction remplie d'incertitude, mais vous permettra d'abstraire comment vous pouvez gérer les exceptions.

https://msdn.microsoft.com/en-us/library/dn178466(v=pandp.30).aspx

En outre, vous pouvez jeter l'exception d'une autre couche de code en validation d'un objet. Si vous lancez Throw New CustomException ("Erreur 121"), votre code catch essayera de savoir quoi faire.Si vous utilisez l'interception, vous pouvez gérer tous les types d'exceptions personnalisées (dérivées de System.Exception)