Какой смысл бросать исключение? - PullRequest
4 голосов
/ 14 декабря 2010

Я пишу класс входа в систему на c #, и я стараюсь проявлять усердие в создании исключений для пустых паролей, недостаточных символов паролей и т. Д. Внезапно мне пришло в голову то, что я делаю с этим исключением?Для чего / для кого они?Обрабатываю ли я исключение или нет, в этот момент приложение все равно не будет работать.Является ли исключение для других разработчиков заказчиком !?

Ответы [ 11 ]

6 голосов
/ 14 декабря 2010

Если вы тот, кто создает исключение, вы не должны ничего с ним делать.

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

6 голосов
/ 14 декабря 2010

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

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

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

Эта статья содержит много хороших рекомендаций: http://msdn.microsoft.com/en-us/library/ms229005.aspx

3 голосов
/ 14 декабря 2010

Исключение само по себе предотвращает более серьезные проблемы в будущем. Если вы просто молча ничего не делали, когда знали, что произошло что-то, чего не должно было быть, программа, вызывающая ваш код, могла бы предположить, что файл пользователя был сохранен, хотя на самом деле это не так, что, очевидно, может быть хуже, чем если бы пользователь "Я не могу сохранить ваш файл."

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

3 голосов
/ 14 декабря 2010

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

2 голосов
/ 14 декабря 2010

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

1 голос
/ 14 декабря 2010

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

0 голосов
/ 14 декабря 2010

Если ваша функция выдает исключение, если она не может войти в систему, то код, вызывающий вашу функцию, может предполагать, что если ваша функция вернется, она вошла в систему. Это облегчит объем работы, которую должен выполнить кодсценарий «успешный вход в систему» ​​в обмен на необходимость дополнительной работы в сценарии «неудачный вход в систему».Если код иногда используется в случаях, когда сбой является маловероятным (например, попробуйте войти в систему с одним набором учетных данных; если это не работает, попробуйте другой набор), а иногда используйте, когда сбой будет неожиданным и неисправимым, он можетполезно иметь либо логический флаг «throw on error», либо использовать отдельные методы «Login» и «TryLogin».

0 голосов
/ 14 декабря 2010

Природа исключений заключается в том, что они должны явно игнорироваться.Предположим, у вас есть эта функция:

bool authenticate ( String username, String password )
{
     if ( invalid_password(password) ) {
         return (false);
     }
     // ... perform authentication ...
}

Теперь рассмотрим, что это часть какого-то сервера, и что сервер работает в высокопривилегированном контексте .Если вызывающий код (тот, который выполняет авторизацию) имеет некоторую ошибку в своей логике, он может непреднамеренно позволить пользователям выполнять действия, которые им обычно не разрешены.

Я бы вместо этого написал следующую функцию:

void authenticate ( String username, String password )
{
     if ( invalid_password(password) ) {
         throw new LoginFailed();
     }
     // ... perform authentication ...
}

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

0 голосов
/ 14 декабря 2010

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

Я собираюсь использовать синтаксис псевдокода, но вы должны быть в состоянии следовать ему:

  var pw=$_POST['pw'];
    var un=$_POST['un'];
    try{
      $sql="select lastlogin,access from users where un=q(/'$un'/) and pw= q(/'md5($pw)'/)";
      $user=$db->getRow($sql);
      if(!$user) {
          //they don't exist
      }else{
        //process their login
      }
    }catch(Exception $e){
          //we has a Database error. either my query s really screwed up or the DB is down. let's log it and exit this stream; service 
           $mylogger->log("Error while logging in using module $MODULENAME$ ".implode("<br/>",(array)$e));

         exit;
    }
0 голосов
/ 14 декабря 2010

Элегантный способ показать, что они (Клиенты) сделали плохо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...