Должен ли метод игнорировать неправильный ввод или вызывать исключение? - PullRequest
3 голосов
/ 20 ноября 2008

Если метод проверяет свои входные данные и обнаруживает неправильные входные данные, что он должен делать: вызывать исключение (или использовать другой механизм ошибок) или ничего не делать / игнорировать неправильный ввод?

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

Я не уверен, какой путь лучше. Поэтому я спрашиваю вас: что вы думаете по этому вопросу?

Ответы [ 5 ]

8 голосов
/ 20 ноября 2008

Определенно выбросить исключение. Исключения раздражают с целью заставить вас сделать что-то с ними.

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

4 голосов
/ 20 ноября 2008

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

2 голосов
/ 20 ноября 2008

Предполагая, что это открытый метод, каков контракт между методом и теми, кто вызывает этот метод?

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

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

В конце концов, это действительно зависит от того, что делает метод, и какие у вас ожидания от метода.

Вы можете заменить Class на метод и иметь те же параметры.

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

Приветствия

-R

2 голосов
/ 20 ноября 2008

Это очень сильно зависит от приложения, которое вы разрабатываете.

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

Другой вариант - изменить недопустимые входные данные на ближайшее допустимое значение (например, если диапазон для целого числа составляет 0–100, и вы получаете -10, было бы хорошо установить его в 0 и продолжить обработку).

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

1 голос
/ 20 ноября 2008

Fail Fast : Никогда не игнорируйте неправильный ввод. Вы можете скрыть проблему и сделать их очень трудно найти.

Некоторые продвигаются очень далеко с Дизайн по контракту (DBC).

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

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