Что в 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 (или пользовательский), плохую идею?
Я не думаю, что "правильный" способ - это любой из этих 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");
(...)
Я думаю, что вся идея здесь
Это то, что я думаю.
Для первого, это более элегантно, но третий - более понятный для чтения и меньше ошибок, подверженных имхо.
Вы должны использовать тот, который легче всего читать. Помните, что код записывается один раз и читается много раз.
Третий - самый легкий для чтения.
Другое правило, которое довольно хорошо. Для каждого метода существует одна запись. Предпочтительно использовать только один оператор 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;
}