Когда бросить исключение? - PullRequest
400 голосов
/ 17 сентября 2008

У меня есть исключения, созданные для каждого условия, которое мое приложение не ожидает. UserNameNotValidException, PasswordNotCorrectException и т. Д.

Однако мне сказали, что я не должен создавать исключения для этих условий. В моем UML эти ARE являются исключениями для основного потока, так почему бы не быть исключением?

Любое руководство или лучшие практики для создания исключений?

Ответы [ 33 ]

0 голосов
/ 17 сентября 2008

Исключения по сравнению с возвращаемым аргументом кода ошибки должны относиться к управлению потоком, а не к философии (насколько «исключительной» является ошибка):

void f1() throws ExceptionType1, ExceptionType2 {}

void catchFunction() {
  try{
    while(someCondition){
      try{
        f1(); 
      }catch(ExceptionType2 e2){
        //do something, don't break the loop
      }
    }
  }catch(ExceptionType1 e1){
    //break the loop, do something else
  }

}

0 голосов
/ 17 сентября 2008

Некоторые полезные вещи, которые следует учитывать при принятии решения о целесообразности исключения:

  1. какой уровень кода вы хотите запустить после появления кандидата на исключение, то есть сколько слоев стека вызовов должно быть разобрано. Как правило, вы хотите обработать исключение как можно ближе к месту его возникновения. Для проверки имени пользователя и пароля вы обычно обрабатываете сбои в одном и том же блоке кода, а не позволяете появиться исключению. Так что исключение, вероятно, не подходит. (OTOH, после трех неудачных попыток входа в систему поток управления может сместиться в другое место, и здесь может быть уместно исключение.)

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

0 голосов
/ 17 сентября 2008

Существует два основных класса исключений:

1) Системное исключение (например, потеря соединения с базой данных) или 2) Пользовательское исключение. (например, подтверждение ввода пользователя, «пароль неверен»)

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

            If TypeName(ex) = "UserException" Then
               Display(ex.message)
            Else
               DisplayError("An unexpected error has occured, contact your help  desk")                   
               LogError(ex)
            End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...