[英]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.