繁体   English   中英

自定义例外-我做对了吗?

[英]Custom exceptions - Am I doing it right?

我目前正在编写.net REST网络api,并且正在使用自定义异常,以便可以将详细信息以及正确的http响应发送回客户端,以保持与REST的兼容性。.但是看来我在明确抛出很多例外。

例如:我有一个用于上传图像文件的API。 这些图像文件必须是某种文件格式,并且必须具有某种大小。 如果我的代码发现图像是错误的文件格式,则抛出新的自定义异常,例如:

throw new FileTypeException();

或者,如果文件太大,则意味着file.Size()大于我在web.config中设置的数量,那么我将抛出另一个自定义异常,例如:

throw new FileSizeException();

然后,我在Post()方法中捕获这些异常,并返回400 BadRequest和一个原因。

因此,我的代码实际上并没有引发错误,只是请求不符合规范。 这是不好的做法吗?

这可能比编程溢出更适合作为编程问题。

在正确的场景中抛出自定义异常可能非常有用,而在错误的场景中抛出很多不必要的工作和复杂性。 通常,我使用的健全性检查对每种不同的异常类型都有不同的处理方式。

例如,您的FileTypeException和FileSizeException-每种类型都有不同的catch吗? 还是您只是返回不同的消息?

如果是后者,请尝试合并您可以使用的地方或使用框架提供的异常。 如果是前者,那么您使用的是自定义例外。

异常过滤器非常适合这些情况。 在您的WebApiConfig中,注册一个异常过滤器

config.Filters.Add(new CustomExceptionFilterAttribute());

基本过滤器的代码:

//needed for CreateErrorResponse(statusCode, message)
using System.Net.Http

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        //you can get the underlying exception here
        var type = context.Exception.GetType();

        //I like to map exception types to status codes
        var statusCode = GetHttpStatusCode(type);

        //respond with a proper status code and the message
        context.Response = context.Request.CreateErrorResponse(statusCode, context.Exception.Message);
    }
}

现在,在任何控制器代码中,您都可以抛出该代码,它将击中您的过滤器

public IHttpActionResult Get(int id)
{
    throw new FileSizeException();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM