Skip to content

Instantly share code, notes, and snippets.

@sherpc
Last active August 29, 2015 14:01
Show Gist options
  • Save sherpc/fab7fa7aa294f421c231 to your computer and use it in GitHub Desktop.
Save sherpc/fab7fa7aa294f421c231 to your computer and use it in GitHub Desktop.
Обработка исключений в API-контроллерах
[HttpPost]
public virtual ActionResult Create(ImportFeedReadModel model)
{
if (!model.IsValid())
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
var service = new ImportFeedService(_importFileRepository, _estateSourceRepository);
try
{
model.Id = service.CreateUserImportFile(UserIdentity.Id, UserIdentity.Name, model.Name, model.Url, model.Format);
return Json(model);
}
catch (NotUniqueUrlException)
{
return Json(JsonErrorViewModel.NotUniqueUrlError());
}
}
public class JsonErrorViewModel
{
private JsonErrorViewModel(string error, dynamic parameters = null)
{
Error = error;
Parameters = parameters;
}
public string Error { get; private set; }
public dynamic Parameters { get; private set; }
// Static factory.
// If neeeded new error key, create new factory method.
public static JsonErrorViewModel NotUniqueUrlError()
{
return new JsonErrorViewModel("NotUniqueUrlError");
}
}
protected override void OnException(ExceptionContext filterContext)
{
filterContext.Result = new JsonResult { Data = filterContext.Exception.ToJsonObject(), JsonRequestBehavior = JsonRequestBehavior.AllowGet };
filterContext.ExceptionHandled = true;
}

Если нужно как-то уведомить клиента об ошибке, бросаем типизированное исключение, ловим его в контроллере и возвращаем JSON-объект с полем Error, в котором записан "ключ" ошибки. Для этого создан класс JsonErrorViewModel:

JsonErrorViewModel.cs

Пример использования:

controller.cs

Если хочется отлавливать все unhandled exceptions контроллера и возвращать человечный JSON, в код контроллера нужно добавить:

OnException.cs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment