C# 如何在ASP.net web api中使用CustomExceptionHandler

C# 如何在ASP.net web api中使用CustomExceptionHandler,c#,asp.net,asp.net-web-api,exceptionhandler,C#,Asp.net,Asp.net Web Api,Exceptionhandler,我试图理解自定义异常处理程序,但没有掌握窍门。我尝试实现一个自定义异常处理程序,如以下几页所述: 现在我的代码是: public class CustomRestErrorHandlerException : ExceptionHandler { public void CustomError(String error) { var message = new HttpResponseMessage(HttpStatusCode.NoContent)

我试图理解自定义异常处理程序,但没有掌握窍门。我尝试实现一个自定义异常处理程序,如以下几页所述:

现在我的代码是:

public class CustomRestErrorHandlerException : ExceptionHandler
{
    public void CustomError(String error)
    {
        var message = new HttpResponseMessage(HttpStatusCode.NoContent)
        {
            Content = new StringContent("An unknown error occurred saying" + error)
        };

        throw new HttpResponseException(message);
    }

    public override void Handle(ExceptionHandlerContext context)
    {
        if (context.Exception is ArgumentNullException)
        {
            var result = new HttpResponseMessage(HttpStatusCode.BadRequest)
            {
                Content = new StringContent(context.Exception.Message),
                ReasonPhrase = "ArgumentNullException"
            };

            context.Result = new ErrorMessageResult(context.Request, result);
        }
        else if (context.Exception is ArgumentException)
        {
            var result = new HttpResponseMessage(HttpStatusCode.NoContent)
            {
                Content = new StringContent(context.Exception.Message),
                ReasonPhrase = "Argument is not found"
            };

            context.Result = new ErrorMessageResult(context.Request, result);
        }
        else if (context.Exception is ArgumentOutOfRangeException)
        {
            var result = new HttpResponseMessage(HttpStatusCode.NotImplemented)
            {
                Content = new StringContent(context.Exception.Message),
                ReasonPhrase = "Argument is out of range"
            };

            context.Result = new ErrorMessageResult(context.Request, result);

        }
        else
        {
            CustomError(context.Exception.Message);
        }
    }

    public class ErrorMessageResult : IHttpActionResult
    {
        private HttpRequestMessage _request;
        private HttpResponseMessage _httpResponseMessage;

        public ErrorMessageResult(HttpRequestMessage request, HttpResponseMessage httpResponseMessage)
        {
            _request = request;
            _httpResponseMessage = httpResponseMessage;
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            return Task.FromResult(_httpResponseMessage);
        }
    }
}
公共类CustomRestErrorHandlerException:ExceptionHandler
{
公共无效自定义错误(字符串错误)
{
var消息=新的HttpResponseMessage(HttpStatusCode.NoContent)
{
Content=new StringContent(“出现了一个未知错误,表示“+错误”)
};
抛出新的HttpResponseException(消息);
}
公共重写无效句柄(例外HandlerContext上下文)
{
if(context.Exception是ArgumentNullException)
{
var结果=新的HttpResponseMessage(HttpStatusCode.BadRequest)
{
Content=新的StringContent(context.Exception.Message),
ReasonPhrase=“ArgumentNullException”
};
context.Result=新的ErrorMessageResult(context.Request,Result);
}
else if(context.Exception是ArgumentException)
{
var结果=新的HttpResponseMessage(HttpStatusCode.NoContent)
{
Content=新的StringContent(context.Exception.Message),
ReasonPhrase=“未找到参数”
};
context.Result=新的ErrorMessageResult(context.Request,Result);
}
else if(context.Exception是ArgumentOutOfRangeException)
{
var结果=新的HttpResponseMessage(HttpStatusCode.NotImplemented)
{
Content=新的StringContent(context.Exception.Message),
ReasonPhrase=“参数超出范围”
};
context.Result=新的ErrorMessageResult(context.Request,Result);
}
其他的
{
CustomError(context.Exception.Message);
}
}
公共类ErrorMessageResult:IHttpActionResult
{
私有HttpRequestMessage\u请求;
私人HttpResponseMessage(HttpResponseMessage);
公共错误消息结果(HttpRequestMessage请求、HttpResponseMessage HttpResponseMessage)
{
_请求=请求;
_httpResponseMessage=httpResponseMessage;
}
公共任务执行同步(CancellationToken CancellationToken)
{
返回Task.FromResult(_httpResponseMessage);
}
}
}
然后我尝试调用我显然做错了的exceptionhandler:(这可能是我不理解的引用:)

处理程序与记录器一样,必须在Web API配置中注册。请注意,每个应用程序只能有一个异常处理程序

因此,将上面的行添加到WebApiConfig.cs文件中,然后简单地从控制器抛出一个异常:

[Route("api/***/***")]
[HttpGet]
public IHttpActionResult Clear****()
{
    // do not use try catch here
    //try
    //{
        // try clearing
    //}
    //catch(Exception e)
    //{
        //throw new CustomRestErrorHandlerException();     << error occurs here 
    //}

    throw new Exception();
}
[路由(“api/***/***”)]
[HttpGet]
公共IHttpActionResult清除****()
{
//不要在这里使用try-catch
//试一试
//{
//尝试清除
//}
//捕获(例外e)
//{
//抛出新的CustomRestErrorHandlerException();必须在Web API配置中注册。这可以在如下所示的WebApiConfig.cs文件中完成,其中配置类型为
System.Web.Http.HttpConfiguration

config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
注册后,在未处理的异常期间会自动调用它们。要测试它,您可能希望在操作方法中引发异常,例如:

[Route("api/***/***")]
[HttpGet]
public IHttpActionResult Clear****()
{
    try
    {
        // try clearing
    }
    catch(Exception e)
    {
        throw new ArgumentNullException();     << error occurs here 
    }

    return this.Ok();
}
[路由(“api/***/***”)]
[HttpGet]
公共IHttpActionResult清除****()
{
尝试
{
//尝试清除
}
捕获(例外e)
{

抛出新的ArgumentNullException();这意味着我只要在那里抛出异常,它就会工作。即使它是抛出新异常();但是如果我只是抛出。它还会处理代码吗?@Tvt是的,所有内容都将被异常处理程序捕获。然后根据异常类型,您可以不同地处理它们。例如,如果ArgumentNullException,您可以在全局异常处理程序中处理该异常,并将响应更改为请求。
config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());
[Route("api/***/***")]
[HttpGet]
public IHttpActionResult Clear****()
{
    try
    {
        // try clearing
    }
    catch(Exception e)
    {
        throw new ArgumentNullException();     << error occurs here 
    }

    return this.Ok();
}