Когда вы пишете обработчики исключений? - PullRequest
4 голосов
/ 20 июня 2009

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

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

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

Мне интересно, как другие разработчики делают это.

Обновление: я просто хотел поблагодарить всех за ответы!

Ответы [ 10 ]

6 голосов
/ 20 июня 2009

Я либо пишу обработчики исключений немедленно, либо разрешаю распространению исключений вверх. Я большой поклонник того, что я называю «Вы не собираетесь возвращаться и исправлять это позже, а вы?» принцип. Вы говорите, что так и будет, но, честно говоря, как только вы заработаете, вы не собираетесь возвращаться и исправлять это позже, не так ли? Просто сделай это прямо сейчас! Напишите ваши обработчики исключений прямо сейчас или добавьте предложение throws и сделайте это проблемой кого-то другого. Делай правильные вещи прямо сейчас.

Но ты знаешь что, иногда ты не можешь. Что бы вы ни делали, не проглатывает исключения с пустыми обработчиками исключений! Это зло:

try {
    connection.close();
}
catch (Exception e) {
    // TODO Auto-generated code
}

Я бросаю удар любому, кто в моей команде это проверяет.

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

catch (IOException exception) {
    exception.printStackTrace();
}

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

catch (IOException exception) {
    log.error(exception, "Unable to open configuration file %s.", fileName);
}

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

catch (IOException exception) {
    throw new RuntimeException(exception);
}
1 голос
/ 20 июня 2009

В моем обработчике исключений я обычно поднимаю исключение более высокого уровня. Например, при синтаксическом анализе файла в Python некоторые операции с строками, списками и dict могут вызывать ValueError, IndexError или KeyError. Эти исключения обычно бесполезны для вызывающей стороны, поэтому я пишу обработчик исключений, который вызывает описательный MyParseError. Я делаю это одновременно с написанием метода, но позже, когда пишу тест, иногда делаю сообщение об исключении более подробным.

1 голос
/ 20 июня 2009

Если я вызываю API, я смотрю, какие исключения могут быть выданы, и решаю, основываясь на списке. Исключения, которые могут быть выброшены, обычно делятся на категории:

  • Невероятно, на мой взгляд, это будет сгенерировано - убедитесь, что код не работает нормально
  • Реалистично, что это будет брошено - что мне делать, если это будет вызвано?
  • Определенно, что это будет выброшено на основе текущих входов - добавьте проверку входов, чтобы остановить его выброс
  • Могу ли я поднять более подходящее исключение? - если исключение может получить вызов, будет ли понятнее другой код вызова, если я вызову новое / другое исключение

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

0 голосов
/ 20 июня 2009

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

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

0 голосов
/ 20 июня 2009

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

0 голосов
/ 20 июня 2009

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

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

0 голосов
/ 20 июня 2009

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

0 голосов
/ 20 июня 2009

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

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

0 голосов
/ 20 июня 2009

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

0 голосов
/ 20 июня 2009

во время разработки , когда:

  • требуется юнит тест
  • когда это требуется для некоторого кода представления / персистентности

EDIT

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

...