Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Перехват Exception в Page_Error


Автор: Sirius_UZ 27.2.2008, 15:27
Как отловив Exception в Page_Error отобразить его на той же странице.
Exception возникает при обработке нажатий кнопок на странице.
Используя код:
Код

 protected void Page_Error(object sender, EventArgs e)
    {        
        Exception ex = Server.GetLastError();        

        errorLabel.Text = ex.Message;

        Server.ClearError();
    }


получаю только пустую страницу. Что в принципе и логично(наверное), Exception то прерывает процесс обработки запроса. Т.е. скорее всего надо его(процесс) восстановить. Но как???
Обработку Exception в блоках try{...}catch{...} использовать не хочется из-за однотипности возникающего исключения и однотипности его обработки, да ко всему прочему хотелось бы иметь унифицированный механизм обработки данного типа Exception используя наследование страничек от базовой, в которой стоит обработчик(хотя можно и на каждой). Поэтому хотелось бы обрабатывать этот тип исключений на текущей странице, а все остальные можно и в Application_Error в Global.asax или в HttpModule, с выводом сообщения об ошибке на отдельной странице. Что можете посоветовать уважаемые?

Автор: tol05 27.2.2008, 16:02
Цитата(Sirius_UZ @  27.2.2008,  14:27 Найти цитируемый пост)
Как отловив Exception в Page_Error отобразить его на той же странице.

Код

protected void Page_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();
        Response.Write(ex.Message);
        Server.ClearError();
    }


Цитата(Sirius_UZ @  27.2.2008,  14:27 Найти цитируемый пост)
Exception то прерывает процесс обработки запроса. Т.е. скорее всего надо его(процесс) восстановить. Но как???

никак. Exception прерывает конвейер обработки запроса на уровне страницы. Если exception не обработано в Page_Error - то и на уровне приложения. Тогда действительно его нужно перехватывать в global.asax

Цитата(Sirius_UZ @  27.2.2008,  14:27 Найти цитируемый пост)
Обработку Exception в блоках try{...}catch{...} использовать не хочется из-за однотипности возникающего исключения и однотипности его обработки, да ко всему прочему хотелось бы иметь унифицированный механизм обработки данного типа Exception используя наследование страничек от базовой, в которой стоит обработчик(хотя можно и на каждой). Поэтому хотелось бы обрабатывать этот тип исключений на текущей странице, а все остальные можно и в Application_Error в Global.asax или в HttpModule, с выводом сообщения об ошибке на отдельной странице.

ИМХО логично. Можешь сделать свой базовый класс, наследник от Page, а свои страницы наследовать уже от него. И в эотм самом классе можно попробовать определить метод Page_Error с обработкой наиболее распространенных исключений.

Автор: Sirius_UZ 27.2.2008, 16:42
Спасибо за ответ.
Цитата

Код

   protected void Page_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();
        Response.Write(ex.Message);
        Server.ClearError();
    }



Данный код выведет сообщение об ошибке, но текущая страница со всеми ее текст боксами и прочими компонентами не появиться... 

В итоге получается что Page_Error - событие для обработки, в котором можно обработать Exception, выполнив необходимые действия, но ошибку при этом показать на текущей странице никак не получиься, только выплюнув используя Server.Transfer, либо используя custom errors pages, либо банальным Response.Redirect. Если хочется сохранить все данные странички и отобразить их вместе с сообщением об ошибке, то необходимо обрабатывать Exception в обработчике нажатия на кнопку(грубо говоря в конвеере обработки запроса) и соответственно вывешивать сообщение об ошибке.
Я правильно понимаю ситуацию? Других вариантов нету?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)