powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / HOT TIP #4 Глобальная обработка исключений в приложениях ASP.NET
3 сообщений из 3, страница 1 из 1
HOT TIP #4 Глобальная обработка исключений в приложениях ASP.NET
    #32351007
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальная обработка исключений в приложениях ASP.NET

ЯЗЫК: C#
ВЕРСИИ ASP.NET: 1.0 | 1.1
АВТОР: Bipin Joshi, http://www.dotnetbips.com/
ПЕРЕВОД: hDrummer

Проблема
В ответ на ошибку времени выполнения приложения ASP.Net происходит возникновение исключения. Исключения предоставляют сотни преимуществ по отношению к модели обработки ошибок в классическом ASP. Например, ошибки являются объектами, есть возможность отлавливать ошибки в зависимости от их типа, присутствует лёгкость реализации структурированной обработки ошибок.
Однако в каждом приложении присутствуют ситуации, когда исключения не отлавливаются и в результате приводят к выводу на экран уродливой страницы с сообщением об ошибке, принятой в ASP.NET по умолчанию (Я бы назвал её красно-коричневая чума – прим. переводчика).
Отсюда возникает вопрос: каким образом сделать так, чтобы пользователь в любом случае видел вашу страницу с сообщением об ошибке, а не страницу, выводимую в случае возникновения исключения по умолчанию?

Решение
Всё это можно сделать, добавив пару строк кода в нужные места файла Global.asax. Если вы не знакомы с этим файлом, то знайте, что он содержит методы, обрабатывающие события уровня приложения и сессии. Например, такие, как старт приложения (Application_Start), начало пользовательской сессии (Session_Start), и некоторые другие.
Объектом нашего внимания в этой статье будет метод Application_Error, выполняющийся в том случае, если исключение не проходит обработку в коде вашего приложения. Процесс обработки таких исключений выглядит таким образом:
- создадим веб-форму с названием error.aspx, она и будет вашей страницей с сообщением об ошибке;
- в Global.asax.cs отловим последнее возникшее исключение;
- вызовем InnerException из исключения, пойманного выше. Это делается потому, что в случае возникновения необработанного исключения, .Net создаёт для него «обёртку» из нового исключения типа HttpUnhandledException;
- поместим несколько значений в объект Session, для того, чтобы получить их на своей странице обработки ошибок;
- обнулим ошибку на сервере;
- перенаправим пользователя на свою страницу error.aspx.

Код Global.asax.cs
Следующий листинг демонстрирует код, необходимый для достижения вышесказанного:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
protected void Application_Error(Object sender, EventArgs e)
{
	try 
	{
	//установка значений по умолчанию
	Session[ "ErrorMsg" ] =  "Нет информации об обшибке" ;
	Session[ "ExceptionType" ] = String.Empty;
	Session[ "PageErrorOccured" ] = Request.CurrentExecutionFilePath;
	Session[ "StackTrace" ] = String.Empty;
	//ловим последнее возникшее исключение
	Exception lastError = Server.GetLastError();
	if (lastError != null)
	{
		//вытягиваем InnerException
		lastError = lastError.InnerException;
		//Записываем значения в переменные объекта  Session для дальнейшего использования
		Session[ "ErrorMsg" ] = lastError.Message;
		Session[ "ExceptionType" ] = lastError.GetType().ToString();
		Session[ "StackTrace" ] = lastError.StackTrace;
	}
	// Обнуление ошибки на сервере
	Server.ClearError();
	// Перенаправление на свою страницу отображения ошибки
	Response.Redirect( "error.aspx" );
	}
	catch (Exception ex) 
	{
	// если мы всёже приходим сюда - значит обработка исключения 
	// сама сгенерировала исключение, в этом случае мы ничего не делаем, чтобы
	// не создать бесконечный цикл
	Response.Write( "К сожалению произошла критическая ошибка. Нажмите кнопку 'Назад' в браузере и попробуйте ещё раз. " );
	}

}


Наша страница Error.aspx
Вот что мы должны сделать в нашей странице error.aspx:
•Добавить на неё метку и назвать её lblMessage.
•Собрать информацию об исключении, которая была помещена в объект Session в Global.asax.cs.
•Очистить значения для текущей сессии.
•Отобразить общее сообщение об ошибке пользователю. Можно даже добавить ссылку на страницу, вызвавшую ошибку.
•Добавить конкретное сообщение об ошибке как HTML-комментарий для использования во время разработки. Этот код должен быть убран при сдаче приложения в эксплуатацию.

В метод Page_Load файла error.aspx.cs, поместим следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
private void Page_Load(object sender, System.EventArgs e)
{
	try 
	{
		if (!Page.IsPostBack) 
		{
// соберём информацию об исключении из сессии
   string errorMsg = Session[ "ErrorMsg" ].ToString();
   string pageErrorOccured = Session[ "PageErrorOccured" ].ToString();
   string exceptionType = Session[ "ExceptionType" ].ToString();
   string stackTrace = Session[ "StackTrace" ].ToString();
// очистим переменные сессии
   Session[ "ErrorMsg" ] = null;
   Session[ "PageErrorOccured" ] = null;
   Session[ "ExceptionType" ] = null;
   Session[ "StackTrace" ] = null;
//отобразим пользователю общее сообщение об ошибке
   lblMessage.Text =  " К сожалению, произошла ошибка выполнения приложения.<br/><br/>" ;
   lblMessage.Text = 
   String.Format( "{0 } Чтобы попробовать ещё раз, кликните <a href='{1}'> здесь</a>.<br/><br/>",
   lblMessage.Text, pageErrorOccured);
//добавим конкретное сообщение об ошибке для просмотра во время разработки
//здесь же можно добавить запись ошибки в журнал событий Windows 
  lblMessage.Text = lblMessage.Text +  "<!--\n"+
 
  "Error Message:  " + errorMsg +" \n "+
  " Page Error Occurred:  " + pageErrorOccured + " \n "+
  " ExceptionType:  " + exceptionType +" \n "+
  " Stack Trace:  " + stackTrace + " \n "+
  "  -->";
 
}
}
catch (Exception ex) 
{
	//если исключение вызвано кодом, написанным выше
	//выведем сообщение об ошибке и StackTrace
	lblMessage.Text = ex.Message+ " " +ex.StackTrace;

}
}

Для проверки выше приведённого кода можно добавить в проект страницу и добавить следующую строку в метод Page_Load:

Код: plaintext
1.
2.
3.
private void Page_Load(object sender, System.EventArgs e)
{
	throw new Exception( "Что-то не работает..." );
}


В результате выполнения этой страницы получим редирект на страницу с сообщением об ошибке и ссылкой на страницу-источник исключения.

Вывод
Плохо, когда пользователь в работе с приложением натыкается на ошибки, но ещё хуже, если пользователь видит непонятное сообщение об ошибке или уродливую страницу, выводимую по умолчанию. Используя приёмы, показанные в этой статье, вы сможете отобразить приличное сообщение на приличной странице, вне зависимости от того, какая ошибка произошла.
...
Рейтинг: 0 / 0
HOT TIP #4 Глобальная обработка исключений в приложениях ASP.NET
    #32351133
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас примерно так и сделано

-- Tygra's --
...
Рейтинг: 0 / 0
HOT TIP #4 Глобальная обработка исключений в приложениях ASP.NET
    #32351134
Фотография hDrummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, для конечного продукта этот подход неплох.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / HOT TIP #4 Глобальная обработка исключений в приложениях ASP.NET
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]