2008-09-30 5 views

ответ

9

Как и с любым .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, он может создать журнал ошибок, которые можно просмотреть, хотя это простой в настройке веб-интерфейс. Вы также можете фильтровать различные типы ошибок и создавать собственные страницы ошибок для разных типов ошибок.

3

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

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

Подробнее здесь: http://www.codeproject.com/KB/aspnet/JcGlobalErrorHandling.aspx

+0

Мы делаем то же самое для всех необработанных исключений. – 2008-09-30 21:43:39

+0

Это звучит очень небезопасно, имеет сомнительное значение, учитывая HttpContext.Current.Server.GetLastError() и, конечно же, имеет проблему с перенаправлением 200 кодов в .NET2.0. – annakata 2009-04-03 08:13:06

0

Ну, это довольно широко открытое, что совершенно здорово. Я приведу вам слово .doc, которое вы можете скачать с Dot Net Spider, что на самом деле является основой для стандартного кода моей маленькой компании. Стандарт включает некоторые очень полезные советы по обработке ошибок.

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

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

try 
{ 
    ... 
} 
catch{} 

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

0

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

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

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

  2. Заносить все исключения, со ссылкой.

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

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

0

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

1

Должен ли я попытаться заблокировать все? Иногда я не хочу улавливать что-либо конкретное, и в любом случае ошибка будет ловить методом выше в иерархии.

Если это основной метод, то что лучше всего подходит для метода sub?


private void mainMethod() 
{ 

    try 
    { 

    subMethod(); 
    } 
    catch 
    { 
    //do something 
    } 
} 

Это:


private void subMethod() 
{ 
    try{ 
    //code 
    //code 
    } 
    catch 
    { 
    throw; 
    } 
} 

Или это:


private void subMethod() 
{ 
    //code 
    //code 
} 

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

    } 
Смежные вопросы