我目前正在编写.net REST web api,并且正在使用自定义异常,以便我可以向客户端发送详细信息以及正确的http响应以保持与REST的兼容..但似乎我是明确地抛出了很多例外。
例如:我有一个用于上传图像文件的API。这些图像文件必须是某种文件格式并且具有一定的大小。如果我的代码发现图像是错误的文件格式,我会抛出一个新的自定义异常,如:
throw new FileTypeException();
或者,如果文件太大,意味着file.Size()大于我在web.config中设置的数量,我会抛出一个不同的自定义异常,如:
throw new FileSizeException();
然后我在Post()方法中捕获这些异常并返回400 BadRequest和原因。
所以,我的代码实际上并没有抛出错误,只是请求不符合规范。这是不好的做法吗?
答案 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();
}