Maison  >  Article  >  développement back-end  >  Filtre ExceptionFilter dans asp.net

Filtre ExceptionFilter dans asp.net

巴扎黑
巴扎黑original
2017-09-01 15:07:371988parcourir

Cet article présente principalement en détail le filtre ExceptionFilter du filtre global asp.net core MVC, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Cette série de cours expliquera l'utilisation du. filtre global intégré dans asp.net core MVC, qui sera divisé dans les chapitres suivants

 asp.net core MVC filter ExceptionFilter filter (1)

 asp.net core MVC filter ActionFilter filtre (2)

filtre MVC de base asp.net Filtre ResultFilter (3)

filtre MVC de base asp.net Filtre ResourceFilter (4)

 Filtre AuthorizationFilter d'asp.net filtre MVC de base (5)

Introduction

Le filtre d'exception, comme son nom l'indique, est lorsqu'un programme se produit. Filtre à utiliser sur les exceptions. Utilisé pour gérer les exceptions non interceptées dans le système.

Implémentation d'un filtre d'exception personnalisé

La personnalisation d'un filtre d'exception global nécessite l'implémentation de l'interface IExceptionFilter


public class HttpGlobalExceptionFilter : IExceptionFilter
  {
    public void OnException(ExceptionContext context)
    {
      throw new NotImplementedException();
    }
  }

Interface IExceptionFilter Ce sera requis pour implémenter la méthode OnException, qui sera déclenchée lorsqu'une exception non interceptée se produit dans le système. La méthode OnException possède un contexte d'exception ExceptionContext, qui contient des informations d'exception spécifiques, HttpContext et des informations de routage mvc. Lorsqu'une exception non détectée se produit dans le système, une approche courante consiste à utiliser un outil de journalisation pour enregistrer les informations détaillées de l'exception afin de faciliter la correction et le débogage. Vous trouverez ci-dessous la mise en œuvre de la journalisation. ​


  /// <summary>
  /// 全局异常过滤器
  /// </summary>
  public class HttpGlobalExceptionFilter : IExceptionFilter
  {
    readonly ILoggerFactory _loggerFactory;
    readonly IHostingEnvironment _env;

    public HttpGlobalExceptionFilter(ILoggerFactory loggerFactory, IHostingEnvironment env)
    {
      _loggerFactory = loggerFactory;
      _env = env;
    }

    public void OnException(ExceptionContext context)
    {
      var logger = _loggerFactory.CreateLogger(context.Exception.TargetSite.ReflectedType);

        logger.LogError(new EventId(context.Exception.HResult),
        context.Exception,
        context.Exception.Message);

        var json = new ErrorResponse("未知错误,请重试");

        if (_env.IsDevelopment()) json.DeveloperMessage = context.Exception;

        context.Result = new ApplicationErrorResult(json);
        context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

      context.ExceptionHandled = true;
    }

public class ApplicationErrorResult : ObjectResult
  {
    public ApplicationErrorResult(object value) : base(value)
    {
      StatusCode = (int)HttpStatusCode.InternalServerError;
    }
  }

public class ErrorResponse
  {
    public ErrorResponse(string msg)
    {
      Message = msg;
    }
    public string Message { get; set; }
    public object DeveloperMessage { get; set; }
  }

Enregistrer le filtre global

Le filtre a été écrit, puis il doit être enregistré dans asp.net core MVC. Recherchez le fichier Startup.cs dans le répertoire racine du système et modifiez la méthode ConfigureServices comme suit


 services.AddMvc(options =>
      {
        options.Filters.Add<HttpGlobalExceptionFilter>();
      });

Test

Throw a dans la demande Exception

Le journal capture correctement les informations d'exception

Le navigateur renvoie une erreur 500 et renvoie un message d'erreur personnalisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn