Вопрос

Какова хорошая практика обработки ошибок для сайта asp.net?Примеры?Спасибо!

Это было полезно?

Решение

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

Например, вы могли бы перехватывать исключения формата для заданных пользователем входных данных (просто в том случае, если проверка JavaScript завершается неудачей, и вы не используете tryparse), но всегда оставляйте перехват исключения верхнего уровня глобальному обработчику ошибок.

     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
        }

Вы можете использовать открытый исходный код эльма (Модули регистрации ошибок и обработчики) для ASP.Net чтобы выполнить этот перехват ошибок верхнего уровня / глобального уровня для вас, если вы хотите.

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

Другие советы

Одна из практик, которую я нахожу особенно полезной, - это создать общую страницу с ошибкой, а затем установить defaultRedirect на узле customErrors в web.config для этой страницы с ошибкой.

Затем настройте свой global.asax для регистрации всех необработанных исключений, а затем поместите их (необработанные исключения) в статическое свойство некоторого класса (у меня есть класс с именем ErrorUtil со статическим свойством lastError).Затем ваша страница с ошибкой может просмотреть это свойство, чтобы определить, что отображать пользователю.

Более подробная информация здесь: http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx

Что ж, она довольно широко открыта, и это совершенно круто.Я отсылаю вас к word .doc, который вы можете скачать с Точечный Сетчатый Паук, который на самом деле является основой для стандарта кода моей небольшой компании.Стандарт включает в себя несколько очень полезных советов по обработке ошибок.

Один из таких примеров исключений (я не помню, является ли это оригиналом документа или мы добавили его в документ):Никогда не выполняйте “перехват исключения и ничего не делайте”. Если вы скроете исключение, вы никогда не узнаете, произошло ли исключение.Вы всегда должны стараться избегать исключений, проверяя все условия ошибки программно.

Пример того, чего не следует делать:

try
{
   ...
}
catch{}

Очень непослушный, если только у вас нет на то веской причины.

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

http://code.google.com/p/elmah/

  1. Защищайте каждую страницу от исключений, которые, как вы ожидаете, могут возникнуть, и обрабатывайте их соответствующим образом, чтобы не отвлекать пользователя каждый раз, когда возникает исключение.

  2. Регистрируйте все исключения со ссылкой.

  3. Предоставьте общую страницу ошибок для любых необработанных исключений, которая предоставляет ссылку для использования в службе поддержки (служба поддержки может идентифицировать детали из журналов).Не отображайте фактическое исключение, так как большинство пользователей его не поймут, но оно представляет потенциальную угрозу безопасности, поскольку раскрывает информацию о вашей системе (потенциально пароли и т.д.).

  4. Не перехватывайте все исключения и ничего с ними не делайте (как в приведенном выше ответе).Для этого почти никогда не бывает веских причин, иногда вы можете захотеть перехватить конкретное исключение и не делать ничего намеренно, но это следует использовать с умом.

Перенаправлять пользователя на страницу стандартной ошибки не всегда хорошая идея.Если пользователь работает над формой, он может не захотеть, чтобы его перенаправляли из формы, над которой он работает.Я помещаю весь код, который может вызвать исключение, внутрь блока try / catch, а внутри блока catch я выдаю предупреждающее сообщение, предупреждающее пользователя о возникновении ошибки, а также регистрирую исключение в базе данных, включая ввод формы, строку запроса и т.д.Однако я разрабатываю внутренний сайт, поэтому большинство пользователей просто звонят мне, если у них возникают проблемы.Для общедоступного сайта вы можете использовать что-то вроде elmah.

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;
        }

    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top