J'ai eu le vertige en écrivant ASP.NET ces deux derniers jours et je veux toujours être paresseux. Étant donné que presque toutes les méthodes du code d’arrière-plan nécessitent try..catch, cela semble très fastidieux. Cela me rappelle aussi l'AOP, mais la méthode de l'AOP est relativement compliquée et il existe de nombreuses méthodes. Par exemple, utilisez Dynamic Proxy, Attribute ou Emit, etc. J'ai soudainement pensé à la nouvelle fonctionnalité de C# 2.0, la délégation anonyme, et j'ai trouvé que c'était un peu moche. . . Cependant, en fait, vous pouvez aussi simplement simuler l'effet de l'AOP de manière relativement légère :
// L'exigence de forcer une classe de base de page dans asp.net n'est pas excessive. . .
classe partielle publique TestLogger : PageBase {
protected void Page_Load (expéditeur de l'objet, EventArgs e) {
// Cette méthode est implémentée dans la classe de base de la page, et la gestion générale des exceptions, la logique de journalisation, etc. peuvent y être implémentées.
EssayerFaire(
// C'est ici que les choses se font réellement
délégué() {
entier a = 1 ;
entier b = 0 ;
int c = a / b ;
},
// Il s'agit d'une gestion d'exception facultative. Si vous passez null, l'exception sera simplement ignorée.
délégué() {
Response.Write("Désolé, une erreur s'est produite.");
}
);
}
}
Le code d'implémentation dans la classe de base de page est très simple et peut également être géré facilement et uniformément. Ici, je suppose que j'utilise simplement log4net pour enregistrer les exceptions :
utiliser le système ;
en utilisant System.Web.UI ;
en utilisant log4net ;
espace de noms SomeNamespace {
//Définir un délégué simple pour transmettre des délégués anonymes
délégué public void MyAction();
//Définir la classe de base de la page
classe publique PageBase : Page {
protected ILog logger ;
// Toute la logique de gestion des exceptions est gérée de manière centralisée dans la classe de base de la page.
protected void TryDo(MonAction doHandler, MonAction exceptHandler) {
essayer {
// Faire quelque chose de pratique
doHandler();
} catch (Exception ex) {
//Journalisation simple des exceptions
logger.Error(ex);
// Un autre traitement
// . . .
// Appelez la gestion des exceptions personnalisée, aucune information spécifique sur l'exception n'est renvoyée ici. Parce qu’il n’est de toute façon pas nécessaire de le montrer à l’utilisateur. . .
si (saufHandler != null)
exceptHandler();
}
}
remplacement protégé void OnInit(EventArgs e) {
// Initialise l'enregistreur. Juste ici, GetType() peut obtenir le type réel de la sous-classe.
logger = LogManager.GetLogger(this.GetType());
base.OnInit(e);
}
}
}
Bon, arrêtons d'écrire ici. Ce n’est qu’une simple idée de ma part. Le but est de mettre en œuvre une gestion centralisée des exceptions ou des logs de manière légère. Bien sûr, cela est incomparable avec le concept AOP complet, mais cela dit, il semble qu'il n'existe actuellement aucun framework AOP parfait dans .NET.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_exception_handling.html