【发布时间】:2012-07-09 20:57:18
【问题描述】:
假设我有一个构造函数,由于我无法控制的原因,它的初始化可能会引发异常。
FantasticApiController(IAwesomeGenerator awesome,
IBusinessRepository repository, IIceCreamFactory factory)
{
Awesome = awesome;
Repository = repository;
IceCream = factory.MakeIceCream();
DoSomeInitialization(); // this can throw an exception
}
通常,当 WebAPI 中的 Controller 操作引发异常时,我可以通过 csutom ExceptionFilterAttribute 处理它:
public class CustomErrorHandler
{
public override void OnException(HttpActionExecutedContext context)
{
// Critical error, this is real bad.
if (context.Exception is BubonicPlagueException)
{
Log.Error(context.Exception, "CLOSE EVERYTHING!");
Madagascar.ShutdownAllPorts();
}
// No big deal, just show something user friendly
throw new HttpResponseException(new HttpResponseMessage
{
Content = new StringContent("Hey something bad happened. " +
"Not closing the ports though"),
StatusCode = HttpStatusCode.InternalServerError;
});
}
因此,如果我有一个BoardPlane API 方法,它会抛出一个BubonicPlagueException,那么我的CustomerErrorHandler 将关闭到马达加斯加的端口并按预期将其记录为错误。在其他不太严重的情况下,我只是显示一些用户友好的消息并返回 500 InternalServerError。
但是在DoSomeInitialization 抛出异常的情况下,这绝对没有任何作用。 如何处理 WebAPI 控制器构造函数中的异常?
【问题讨论】:
-
WebApi 的一个有趣特性是您可以轻松自定义异常返回给客户端的方式。同一操作方法中的状态和 Html 错误。显然,如果在构造函数中抛出异常,您将失去所有这些。我认为你应该避免这种情况发生。大多数逻辑应该放在 webapi 方法而不是构造函数中。也就是说我认为你应该使用标准的 asp.net 错误处理,即在 Web.Config 中配置错误页面,或者在全局 asax 中拦截 onerror 事件
标签: exception-handling asp.net-web-api asp.net-4.5