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

时间:2015-06-24 23:40:11

标签: c# .net exception asp.net-web-api asp.net-web-api2

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

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

throw new FileTypeException();

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

throw new FileSizeException();

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

所以,我的代码实际上并没有抛出错误,只是请求不符合规范。这是不好的做法吗?

2 个答案:

答案 0 :(得分:1)

这可能更适合作为编程问题而不是Stack Overflow。

抛出自定义异常在正确的场景中非常有用,并且在错误的场景中会产生大量不必要的工作和复杂性。通常我使用的健全性检查是针对每种不同异常类型的不同处理。

例如,您的FileTypeException和FileSizeException - 每种类型都有不同的catch吗?或者你刚才回复了另一条消息?

如果是后者,请尝试合并您可以使用的框架或使用框架提供的例外情况。如果它是前者,那么您正确使用自定义例外。

答案 1 :(得分:0)

异常过滤器适用于这些情况。在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();
}