Есть ли способ заменить повторяющиеся блоки try try? - PullRequest
0 голосов
/ 26 апреля 2019

В моем первом приложении asp.net mvc я обрабатываю ошибки с помощью блоков try-catch и возвращаю конкретные сообщения пользователю в виде Httpstatuscode. В каждой обычной операции есть один и тот же кодовый блок.

Я пытался использовать атрибут исключения обработчика, но мне не удалось вернуть код состояния или пользовательское сообщение с ним.

Есть ли способ заменить эти блоки try catch для каждой функции и вернуть сообщение пользователю?

Вот что я пробовал:

public class ExceptionHandlerFilterAttribute : FilterAttribute, IExceptionFilter
{ 
    private ILogger _logger;

    public void OnException(ExceptionContext filterContext)
    {
        _logger = new NLogLogger();
        if (!filterContext.ExceptionHandled)
        {
            var controller = filterContext.RouteData.Values["controller"].ToString();
            var action = filterContext.RouteData.Values["action"].ToString();
            var message = filterContext.Exception;

            _logger.Log(Business.Enums.LogLevel.Error, string.Concat("/",controller,"/",action), message);

            filterContext.ExceptionHandled = true;

            filterContext.Result = new ViewResult()
            {
                ViewName = "Error"
            };
        }
    }
}

Это пример метода:

  public HttpStatusCodeResult Create(Product product)
    {
       if (!ModelState.IsValid) return new HttpStatusCodeResult(HttpStatusCode.BadGateway);

        try
        {
            _productService.Create(product);

            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
        catch (Exception) { return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); }

    }

Я хотел бы заменить повторяющиеся блоки try-catch на лучший код.

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Вы можете обернуть ваши методы примерно так:

    /// <summary>
    /// Tries the specified action.
    /// </summary>
    /// <param name="action">The action.</param>
    public static HttpStatusCodeResult Try(Action action, ModelState model)
    {
        if (!model.IsValid) return new HttpStatusCodeResult(HttpStatusCode.BadGateway);
        try
        {
            action();
            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
        catch (Exception) { return new HttpStatusCodeResult(HttpStatusCode.InternalServerError); }
    }

И вы можете использовать свой Try:

 public HttpStatusCodeResult Create(Product product)
 {
    return Try(()=> {
        _productService.Create(product);
    }, ModelState);
 }

Вот пример оболочки в github

И вызов этой попытки

0 голосов
/ 26 апреля 2019

Попробуйте установить HttpStatusCodeResult для Result свойство filterContext:

filterContext.Result = new HttpStatusCodeResult(HttpStatusCode.InternalServerError);

...