Обработка исключений в веб-форме ASP.NET PageBase? - PullRequest
0 голосов
/ 17 февраля 2012

1) У меня есть класс PageBase, который наследуется от Page Class. Весь код наследуется от класса PageBase. Поэтому я хочу добавить логику обработки исключений в класс PageBase.

В Page_Error Event я добавил логику для обработки исключения, но я хочу, чтобы страница отображалась правильно с подробностями об исключении, отображаемыми в верхней части веб-страницы.

* 1005 например *

В веб-форме у меня есть кнопка управления, которая обновляет данные в базе данных. При нажатии кнопки у меня есть логика для обновления данных. При обновлении может выдать исключение. Я не хочу ставить блок Try catch на логику сохранения кнопки. Вместо этого я хочу, чтобы какой-то метод или событие в PageBase перехватило исключение и полностью отобразило страницу со всеми элементами управления и исключением в заголовке.

2) `// в Базовом классе страницы CodeBehind я написал

protected void TryAction(Action action)
{
  try
  {
    action();
  }
  catch(Exception e)
  {
    // write exception to output (Response.Write(str))
  }
}

В CodeBehind я написал код для события нажатия кнопки

Private List<T> GetData(string a, string b)
{
  List<T> _lst;
  TryAction(()=>{
     //Call BLL Method to retrieve the list of BO.
     _lst = BLLInstance.GetAllList(a,b);
  });
  return _lst;
}

Это отлично работает, я хочу,

Private List<T> GetData(string a, string b)
{
  TryAction(()=>{
     //Call BLL Method to retrieve the list of BO.
     return BLLInstance.GetAllList(a,b);
  });
}

Отображается ошибка «System.Action retuens void». Подскажите, пожалуйста, как использовать TryAction Method, если у нас есть тип возврата.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Не ловите исключение и продолжайте. Это вряд ли когда-либо правильно думать и никогда не отображать информацию об исключениях для пользователя. Техническая природа этих ошибок раздражает их, что приводит к утечке информации, что является проблемой безопасности.

Вместо этого настройте приложение так, чтобы оно отображало пользовательские сообщения об ошибках RemoteOnly, и используйте каркас ведения журналов для регистрации исключений. ELMAH является отличной основой для этого. Получите это от NuGet.

1 голос
/ 17 февраля 2012

Когда выдается исключение, если вы его не перехватите, оно всплывет до Page_Error, а затем Application_Error. Как только он попадает в Page_Error, он уже прервал рендеринг страницы. Я не думаю, что есть способ продолжить рендеринг остальной части страницы. Если вы хотите увеличить повторное использование кода вашей логикой обработки ошибок, вы можете использовать анонимный метод.

// on your base page
protected void TryAction(Action action)
{
    try
    {
        action();
    }
    catch(Exception e)
    {
        // write exception to output (Response.Write(str))
    }
}

protected void TryFunction<T>(Function<T> func)
{
    try
    {
        return func();
    }
    catch(Exception e)
    {
        // write exception to output (Response.Write(str))

        return default(T);// have to return something now because it's a function.
    }
}

тогда ваш метод доступа к данным может выглядеть как

protected void Button1_Click(object sender, EventArgs e)
{
    TryAction(() => {
        // Do stuff here - save to database etc
    });
}

protected void Button1_Click(object sender, EventArgs e)
{
    return TryFunction<string>(() => {
        // Do stuff here - save to database etc
        return "woo";
    });
}

Стоит отметить, что если в функции возникает исключение, вы можете не получить из него полезное значение и вам следует соответствующим образом кодировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...