C # лучшая практика обработки ошибок и передачи сообщений об ошибках - PullRequest
2 голосов
/ 19 сентября 2009

Я использую asp.net, и я всегда борюсь за аккуратный способ обработки ошибок и, если они есть, передачи сообщения об ошибках пользователю. Например, у меня есть класс User, класс UserManager и класс Database. Imagina Я хочу показать всем пользователям, показать, что я вызываю метод GetAllUsers из UserManager, который возвращает список объектов User. Этот метод создает объект базы данных и вызывает метод ExecuteQuery (строковый запрос).

EDIT: А теперь моя проблема, представьте, что что-то идет не так в методе ExecuteQuery () (не удалось открыть базу данных). Я хочу уведомить пользователя, что что-то пошло не так при открытии соединения с базой данных. Как я должен сделать это и обращаться с этим аккуратно?

РЕДАКТИРОВАТЬ 2:

Не могли бы вы сделать что-то вроде этого? Или иным образом?

public class Database()
{
   private string _Error;

   // property error (only get)

   private void Open()
   {
     try
     {
       // Open DB
       // Fails because of error          
     }
     catch(Exception ex)
     {
       _Error = ex.Message;
     }
   }

   public DataSet ExecuteQuery(string query)
   {
      try
      {
        Open();

        // Execute query

        // return dataset
       }
       catch(Exception ex)
       {
          _Error = ex.Message;
          return null;
       }
   }
}

public class UserManager ()
{
   private string _Error;

   // Get property for Error       

   public List<User> GetAllUsers ()
   {
      Database db = new Database()

      Dataset DS = db.ExecuteQuery("my query goes here");

      (if DS == null)
      {
        _Error = db.Error;
        return null;
      }

   }
}

В пользовательском интерфейсе при событии щелчка:

protected void onClick_event(args)
{

  Usermanager userman = new UserManager();
  List<User> users = userman.GetAllUsers();

  if(users == null)
  {
    // make a error panel visible
    pnlError.Visible = true;
    lblError.Text = userman.Error
  }
}

Это хороший подход?

Ответы [ 4 ]

3 голосов
/ 19 сентября 2009

Я думаю, что вы пропустили правильный способ обработки исключений. Хранение текста, который зависит от языка / языка в вашей базе данных, не очень хорошая идея. Ошибка также может не иметь смысла в контексте, в котором она была выполнена, вызывающий метод знает, что предназначено, но код, который извлекает значение из базы данных, не знает о «более высоких целях» вашего кода! Описание ошибки базы данных также может вообще не интересовать пользователей, для них система просто не может получить список пользователей, вот и все. Для разработчиков важно знать, что именно не так. Отображение этого для пользователей может также отображать данные, которые вы не хотите, чтобы они отображали, например имена таблиц, пароли, имена пользователей базы данных, в зависимости от того, что содержит исключение (которое вы не можете контролировать)

Итак, как с этим справиться:

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

    • Не изменяйте состояние объекта, пока не станет ясно, что ничто не может пойти не так, чтобы поддерживать ваш объект в согласованном состоянии. Это означает, что не начинайте изменять элементы, тогда возникает исключение, и вам придется сбросить их все в их предыдущее состояние в блоке finally.
    • Запустите свои операции и сгенерируйте исключение по проблемам (не поймайте это здесь, бессмысленно, вы бы просто сохранили сообщение или целое исключение для последующего поиска!)
    • В случае успеха скопируйте временные переменные в члены объекта

Таким образом, вы всегда будете иметь объект в согласованном состоянии и чистый код.

3 голосов
/ 19 сентября 2009

Все зависит от типа проблемы, возникшей у вас при выполнении запроса. Эти проблемы могут быть чем угодно: от отсутствия записей до сбоя соединения. Если проблема заключается в том, что вы можете проверить, в случае отсутствия записей, вы можете проверить это и представить вашему пользователю сообщение о том, что записи не найдены. Даже в случае сбоя соединения вы сможете проверить это и сообщить об этом своему пользователю.

В случае проблем, которые вы не можете проверить, в зависимости от типа приложения, которое вы пишете, вы можете разрешить сбою приложения и использовать некоторую инфраструктуру, например ELMAH , регистрировать и сообщать об ошибке.

попробуйте эти ссылки, которые приходят из моего другого сообщения по этой теме для получения дополнительной информации

Блог группы анализа кода

Мартин Фаулер - Fail Fast

MSDN при обработке исключений

Проверено против непроверенных исключений

Также эта отличная статья была недавно опубликована

2 голосов
/ 19 сентября 2009

Либо добавив в оператор , либо сделав попытку / окончание, чтобы убедиться, что соединение db удалено, так как этот конкретный тип исключения может быть проблемой для вас.

Эта бесплатная книга Карла Сегина содержит главу по обработке исключений, которая должна прояснить для вас вещи.

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

1 голос
/ 19 сентября 2009

Если вы не хотите использовать обычные элементы try / catch и отображать ошибки в catch, тогда существует событие Page.Error , которое вы можете использовать для обработки ошибок в контексте вашего стр. В рамках этого вы должны вызвать Server.GetLastError (), чтобы получить последнее сгенерированное исключение, а затем сообщить пользователю, что что-то пошло не так, перенаправив его на страницу ошибки или показывая / скрывая элементы ошибки на вашей странице.

...