Обработайте ошибки с ErrorController, а не прямым представлением

Ваш вопрос состоит из двух частей.

  1. Опции в ConfigObj могут быть либо строкой, либо списком строк.

    [Parameters]
      name = hello1             # This will be a string
      pets = Fluffy, Spot       # This will be a list with 2 items
      town = Bismark, ND        # This will also be a list of 2 items!!
      alt_town = "Bismark, ND"  # This will be a string
      opt1 = foo,               # This will be a list of 1 item (note the trailing comma)
    

    Итак, если вы хотите, чтобы что-то отображалось в виде списка в ConfigObj, вы должны убедиться, что оно содержит запятую. Список из одного элемента должен иметь запятую.

  2. В Python строки являются итеративными. Таким образом, даже если они не являются списком, их можно повторять. Это означает, что в выражении типа

    print(", ".join(para['name']))
    

    строка para['name'] будет перебираться, создавая список ['h', 'e', 'l', 'l', 'o', '1'], который Python покорно объединяет вместе с пробелами, создавая

    h e l l o 1
    
6
задан Boris Callens 13 October 2008 в 12:32
поделиться

4 ответа

HandleErrorAttribute, который идет с MVC, является довольно основной IExceptionFilter.

У Вас есть несколько опций достигнуть того, что я думаю, что Вы хотите.

Можно или использовать [HandleError (Type=typeof(MyException), Представление = "ErrorView")] на действиях/контроллерах или реализовывать собственное

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

Переопределение OnException предоставляет Вам доступ ко всей этой информации, в которой Вы, возможно, нуждаетесь - контроллер, действие, данные маршрутов, и т.д. - через ExceptionContext.

Не забудьте устанавливать ExceptionHandled. Затем можно установить filterContext. Результат к новому экземпляру RedirectToAction, которые перенаправляют к Вашему ErrorController и действию - очевидно, можно выставить определенный контроллер и действие со свойствами.

4
ответ дан 17 December 2019 в 00:16
поделиться

Почему бы не создать Ваш собственный ErrorResult, происходящий из ActionResult?

1
ответ дан 17 December 2019 в 00:16
поделиться

То, что я делаю (который может или не может быть хорошей практикой), является этим:

Когда ошибка происходит:

  • Если я ожидал это и могу обработать его, я делаю (вход его с ELMAH)
  • Если я ожидал это и не могу обработать его, я регистрирую его к ELMAH и возвращаю ViewResult, который является моей ошибочной страницей
    • Включайте описание ошибки, стандартное сообщение и ссылку назад на то, что я делал
  • Если я не ожидал это, мое переопределение OnError в моем основном классе контроллера делает предыдущий шаг
  • Все другие ошибки, которые не могут быть обработаны, автоматически зарегистрированы ELMAH и запросом yellowscreens

Большая часть моей универсальной обработки ошибок входит в базовый класс для всех моих контроллеров. Единственная проблема - то, что я должен вручную установить контроллер и значение действия в базовом классе так, чтобы это могло генерировать ActionLink для перенаправления на ошибочной странице.

0
ответ дан 17 December 2019 в 00:16
поделиться

Леппи, если вы хотите отправить результат действия, вы можете определить действие и контроллер для перенаправления при ошибке. Это хороший пример, но лично мне не нравится не использовать пользовательские страницы или http-коды для кодов

Вот и пример моего IExtenptionFilter. Мой базовый контроллер имеет IExceptionFilter по умолчанию для обработки всех неконтролируемых ошибок.

[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes",
    Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class GenericExceptionHandlerFilter : ActionFilterAttribute, IExceptionFilter
{

    public Type ExceptionType { get; set;}
    public string RedirectToAction { get; set;}
    public string RedirectToController { get; set;}

    protected bool ApplyFilter(ExceptionContext filterContext)
    {
        Type lExceptionType = filterContext.Exception.GetType();
        return (ExceptionType == null ||
                lExceptionType.Equals(ExceptionType));
    }


    #region IExceptionFilter Members
    public void OnException(ExceptionContext filterContext)
    {

        if (ApplyFilter(filterContext))
        {
            IbfControllerLogger.Log(filterContext.Exception);

            filterContext.ExceptionHandled = true;

            #region Calculate Action Controller Error
            RouteValueDictionary lRoutes = new RouteValueDictionary(new
                {
                    action = RedirectToAction,
                    controller = String.IsNullOrEmpty(RedirectToController) ? (string)filterContext.RouteData.Values["controller"] : RedirectToController
                });
            UrlReWriterUtils.UrlReWriter(filterContext.Controller.ViewData, lRoutes);
            #endregion

            filterContext.Controller.TempData[TempDataName.C_TEMPDATA_EXCEPTIONERROR] = filterContext.Exception;
            filterContext.Result = new RedirectToRouteResult(lRoutes);
        }
    }
    #endregion
2
ответ дан 17 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: