Автор: Russ Nemhauser
Ошибку можно исправить только если о ней знать. Многие
пользователи не будут использовать вашу программу, если в ходе
ее выполнения они наткнутся на ошибку, которая остановит
работу приложения. Вот почему разработчику необходимо как
можно раньше узнать о случае и месте возникновения проблемы
для того чтобы по возможности устранить ее уже после первого
случая появления. В этой статье мы рассмотрим вариант
автоматического уведомления администратора приложения ASP.NET
об произошедшей ошибке.
Файл конфигурации web.config имеет секцию, называемую
<CUSTOMERRORS>, которую мы можем использовать для того чтобы
переадресовать (редирект) пользователя к заранее
подготовленной странице с объяснением об обнаруженной
проблеме. Причем мы можем даже определить различные страницы
для каждого типа ошибки (404 - Файл не найден, и т.п.). Для
начала создадим переадресацию к единой странице
DefaultErrorPage.aspx. Для того, чтобы сделать, изменим наш
web.config следующим образом:
<customErrors defaultRedirect="DefaultErrorPage.aspx" mode="on">
</customErrors>
В зависимости от типа и назначения вашего приложения
DefaultErrorPage.aspx может содержать либо детальное сообщение
об ошибке, либо простое уведомление о "временном сбое в
работе", в нашем примере для выполнения теста вы можете просто
добавить одно слово "Error!".
Теперь проверим как это все работает. Фатальную ошибку в
работе приложения вызовем нарочно, например, при помощи
SqlException (System.Data.SqlClient Namespace) путем попытки
несуществующей БД. Для этого добавьте следующий код в
процедуру Page_Load любого вашего скрипта.
VB
Dim c As SqlConnection = New SqlConnection _
("server=MyServer;database=IncorrectDatabase;user
id=MyUser;password=MyPassword")
c.Open()
C#
SqlConnection c = new SqlConnection("server=MyServer;database=IncorrectDatabase;user
id=MyUser;password=MyPassword");
c.Open();
Теперь решим, что было бы полезным знать о месте в
котором произошла ошибка. Самое главное, это URL неработающей
страницы с параметрами QueryString. Если ваше приложение
использует аутентификацию Windows (Integrated Windows
Authentication), т.е. интранет-приложение, то было бы
интересным знать также и значение AUTH_USER объекта
ServerVariables. Кроме того, нам потребуется наименование
самого исключения (Exception) и трассировка StackTrace,
которая может быть полезной для выявления точного места
ошибочного кода в программе.
Следующая вещь, которую мы должны сделать - это изменить
файл global.asax для того, чтобы регистрировать нашу ошибку. В
global.asax.vb (global.asax.cs) найдите процедуру
Application_Error (или создайте ее, если она не существует).
Эта процедура выполняется каждый раз, когда в приложении имеет
место фатальная ошибка. Поместим в нее код, отсылающий
e-mail-сообщение администратору сайта. В зависимости от того,
какой язык вы используете (VB.NET или C#) для работы с e-mail
вам потребуется сослаться на System.Web.Mail в файле
global.asax.vb или global.asax.cs
VB
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim msg As MailMessage = New MailMessage()
SmtpMail.SmtpServer = "MyMailServer"
msg.Body = "Error: " & Server.GetLastError().InnerException.ToString() _
& vbCrLf & vbCrLf & Request.Url
msg.To = "webmaster@mycompany.com"
msg.From = "errors@mycompany.com"
msg.Subject = "Application Error"
SmtpMail.Send(msg)
End Sub
C#
protected void Application_Error(Object sender, EventArgs e)
{
MailMessage msg = new MailMessage();
SmtpMail.SmtpServer = "MyMailServer";
msg.Body = "Error: " + Server.GetLastError().InnerException.ToString()
+ "\n\n" + Request.Url;
msg.To = "webmaster@mycompany.com";
msg.From = "errors@mycompany.com";
msg.Subject = "Application Error";
SmtpMail.Send(msg);
}
Попробуйте откомпилировать и запустить проект. Как
видите, реализация подобного уведомления о проблемах в
приложении довольна проста, и в то же время несет в себе
большую возможность дать знать об ошибке разработчику сайта
уже после первого случая ее возникновения, не дожидаясь когда
после многочисленных неудач пользователи сами сообщат ему об
этом.