Что такое хорошая практика обработки ошибок для сайта asp.net? Примеры? Спасибо!
Хорошая практика обработки ошибок
Ответ 1
Как и в любом проекте .net, я считаю, что лучший способ - только улавливать определенные типы ошибок, если они могут произойти на данной странице.
Например, вы можете поймать "Исключения формата" для данного пользователя (просто если проверка JavaScript не выполняется, и вы не используете tryparse), но всегда оставляйте захват верхнего уровня Exception глобальным обработчиком ошибок.
try
{
//Code that could error here
}
catch (FormatException ex)
{
//Code to tell user of their error
//all other errors will be handled
//by the global error handler
}
Вы можете использовать открытый elmah (модули регистрации ошибок и обработчики) для ASP.Net для этого верхнего уровня/глобального если вы захотите.
Используя elmah, он может создать журнал ошибок, который можно просмотреть, хотя простой для настройки веб-интерфейса. Вы также можете фильтровать различные типы ошибок и создавать собственные страницы ошибок для разных типов ошибок.
Ответ 2
Одна из практик, которую я считаю особенно полезной, заключается в создании общей страницы ошибок, а затем задайте свой defaultRedirect на customErrors node файла web.config на этой странице ошибок.
Затем настройте свой global.asax для регистрации всех необработанных исключений, а затем поместите их (необработанные исключения) в статическое свойство в каком-то классе (у меня есть класс ErrorUtil со статическим свойством LastError). Затем страница с ошибкой может посмотреть это свойство, чтобы определить, что показывать пользователю.
Подробнее здесь: http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx
Ответ 3
Должен ли я попытаться заблокировать все? Иногда я не хочу улавливать что-либо конкретное, и в любом случае ошибка будет улавливаться методом выше в иерархии.
Если это основной метод, что лучше всего подходит для метода sub?
private void mainMethod()
{
try
{
subMethod();
}
catch
{
//do something
}
}
Это:
private void subMethod()
{
try{
//code
//code
}
catch
{
throw;
}
}
Или это:
private void subMethod()
{
//code
//code
}
Ответ 4
Хорошо, это довольно широко открытое, что совершенно здорово. Я передам вам слово .doc, которое вы можете скачать из Dot Net Spider, который на самом деле является основой для моего небольшого стандартного кода компании. Стандарт включает некоторые очень полезные советы по обработке ошибок.
Один такой пример для исключений (я не помню, является ли это оригиналом для документа или если мы добавили его в документ): Никогда не делайте "исключение catch" и ничего не делайте ". Если вы скрываете исключение, вы никогда не узнаете, произошло ли исключение. Вы всегда должны избегать исключений, программно программируя все ошибки.
Пример того, что не делать:
try
{
...
}
catch{}
Очень озорной, если у вас нет веских оснований для этого.
Ответ 5
Вы должны убедиться, что вы можете уловить большинство ошибок, созданных вашим приложением, и отобразить дружественное сообщение для пользователей. Но, конечно, вы не можете поймать все ошибки за то, что вы можете использовать web.config и defaultRedirect другим пользователем. Еще одним очень удобным инструментом для регистрации ошибок является ELMAH. ELMAH зарегистрирует все ошибки, сгенерированные вашим приложением, и покажет их вам очень читаемым способом. Подключение ELMAH в вашем приложении так же просто, как добавление нескольких строк кода в файл web.config и подключение сборки. Вы должны обязательно дать ELMAH попробовать, это буквально сэкономит вам часы и часы боли.
Ответ 6
-
Защитный код на каждой странице для исключений, которые вы ожидаете, может произойти и иметь дело с ними надлежащим образом, чтобы не прерывать пользователя каждый раз, когда возникает исключение.
-
Запишите все исключения со ссылкой.
-
Предоставьте общую страницу ошибок для любых необработанных исключений, которая предоставляет ссылку на использование для поддержки (поддержка может идентифицировать данные из журналов). Не показывайте фактическое исключение, так как большинство пользователей не понимает этого, но потенциально опасно для безопасности, поскольку оно предоставляет информацию о вашей системе (потенциально пароли и т.д.).
-
Не перехватывайте все исключения и ничего не делайте с ними (как в приведенном выше ответе). Практически никогда не бывает веских оснований для этого, иногда вы можете захотеть поймать конкретное исключение и не делать преднамеренно, но это следует использовать разумно.
Ответ 7
Не всегда рекомендуется перенаправить пользователя на стандартную страницу ошибок. Если пользователь работает над формой, они могут не захотеть перенаправляться от формы, над которой они работают. Я поместил весь код, который мог бы вызвать исключение внутри блока try/catch, а внутри блока catch я выплюнул предупреждающее сообщение, предупреждающее пользователя о том, что произошла ошибка, а также журнал исключения в базе данных, включая ввод формы, строку запроса и т.д. Однако я разрабатываю внутренний сайт, поэтому большинство пользователей просто называют меня, если у них есть проблема. Для общедоступного сайта вы можете использовать что-то вроде elmah.
Ответ 8
public string BookLesson(Customer_Info oCustomerInfo, CustLessonBook_Info oCustLessonBookInfo)
{
string authenticationID = string.Empty;
int customerID = 0;
string message = string.Empty;
DA_Customer oDACustomer = new DA_Customer();
using (TransactionScope scope = new TransactionScope())
{
if (oDACustomer.ValidateCustomerLoginName(oCustomerInfo.CustId, oCustomerInfo.CustLoginName) == "Y")
{
// if a new student
if (oCustomerInfo.CustId == 0)
{
oCustomerInfo.CustPassword = General.GeneratePassword(6, 8);
oCustomerInfo.CustPassword = new DA_InternalUser().GetPassword(oCustomerInfo.CustPassword, false);
authenticationID = oDACustomer.Register(oCustomerInfo, ref customerID);
oCustLessonBookInfo.CustId = customerID;
}
else // if existing student
{
oCustomerInfo.UpdatedByCustomer = "Y";
authenticationID = oDACustomer.CustomerUpdateProfile(oCustomerInfo);
}
message = authenticationID;
// insert lesson booking details
new DA_Lesson().BookLesson(oCustLessonBookInfo);
}
else
{
message = "login exists";
}
scope.Complete();
return message;
}
}