Скажем, у меня есть конструктор, где его инициализация потенциально может вызвать исключение по причинам, не зависящим от меня.
FantasticApiController(IAwesomeGenerator awesome,
IBusinessRepository repository, IIceCreamFactory factory)
{
Awesome = awesome;
Repository = repository;
IceCream = factory.MakeIceCream();
DoSomeInitialization(); // this can throw an exception
}
Обычно, когда действие Controller в WebAPI генерирует исключение, я могу обработать его с помощью 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;
});
}
Итак, если у меня есть метод API BoardPlane
, который генерирует BubonicPlagueException
, то мой CustomerErrorHandler
отключит порты на Мадагаскар и зарегистрирует его как ошибку, как ожидалось. В других случаях, когда это не очень серьезно, я просто показываю какое-то удобное для пользователя сообщение и возвращаю 500 InternalServerError
.
Но в тех случаях, когда DoSomeInitialization
генерирует исключение, это абсолютно ничего не делает. Как я могу обрабатывать исключения в конструкторах контроллера WebAPI?