Обработка ошибок Java, как правильно это исправить?

1

Что в java правильный метод обработки параметров метода/внутренних ошибок?

Все три метода делают то же самое, с небольшой разницей во втором, где исключение также имеет раздел "вызванный".

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

Считайте также, что обработка исключений довольно дорога в java (я читал это где-то).

Благодарю!!

public static String method(String arg) {
  block: {
    if (arg == null) {
      logger.error("arg is null");
      break block;
    }
    try {
      ...  
      return "ok";
    } catch (Exception e)
      logger.error("help!", e);
    }
  }
  return "ko";
}

public static String method(String arg) {
  try {
    if (arg == null) {
      throw new Exception("arg is null");
    }
    ...
    return "ok";
  } catch (Exception e) {
    logger.error("help!", e);
    return "ko";
  }
}

public static String method(String arg) {
  String result = "ko";
  if (arg == null) {
    logger.error("arg is null");
    return result;
  }
  try {
    ..
    result = "ok";
  } catch(Exception e) {
    logger.error("help!", e);
  }
  return result;
}

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

  • 0
    Бессмысленно выбрасывать исключение и перехватывать его одним и тем же методом, за несколько строк. В противном случае выбор между первой и третьей схемами является одним из личных предпочтений (наряду с другими требованиями к дизайну).
  • 0
    Я бы позволил методу бросить исключение
Теги:
exception
error-handling

3 ответа

1

Я не думаю, что "правильный" способ - это любой из этих 3.

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

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

    public static String method(String arg) {
        return arg==null?"ko":"ok";
    }

Здесь нет исключений.

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

Явный

 * @param      s   the string to be parsed.
 * @return     a {@code Double} object holding the value
 *             represented by the {@code String} argument.
 * @throws     NumberFormatException  if the string does not contain a
 *             parsable number.
 */
public static Double valueOf(String s) throws NumberFormatException {
    return new Double(FloatingDecimal.readJavaFormatString(s).doubleValue());
} 

неявный

 * @param   uri
 *          the URI to convert
 *
 * @return  the resulting {@code Path}
 *
 * @throws  IllegalArgumentException
 *          if preconditions on the {@code uri} parameter do not hold. The
 *          format of the URI is provider specific.
   (...)
 */
public static Path get(URI uri) {
    String scheme =  uri.getScheme();
    if (scheme == null)
        throw new IllegalArgumentException("Missing scheme");
    (...)

Я думаю, что вся идея здесь

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

Это то, что я думаю.

0

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

  • 0
    Это просто на основе мнения. Кроме того, этикетки следует избегать любой ценой; они в основном включены для поддержки автоматической генерации кода.
-1

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

Третий - самый легкий для чтения.

Другое правило, которое довольно хорошо. Для каждого метода существует одна запись. Предпочтительно использовать только один оператор return.

Причина в том, что читателю легче понять, что такое мысль с кодом.

Подробнее об этих проблемах вы можете прочитать в "Чистом коде" http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Предложение для решения с одним входом:

public static String method(String arg) {
    String outString = "ko";
    try {
        if (arg != null) {
            outString = "ok";
        } else {
            logger.debug("arg is null");
        }
    } catch (Exception e) {
        logger.error("Help!", e);
    }
    return outString;
}
  • 0
    Итак, вы говорите мне, что хотя третий легче читать, первый выполняет правило «один вход / один выход», чем это предпочтительный способ следовать?
  • 0
    Ни один из них не следует за одной записью, существующей-правилом. Я хотел бы codit что-то вроде этого. Я пытался добавить код в комментарии. Но не смог. Поэтому я обновил свой ответ новым примером.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню