Java错误处理,处理这个问题的正确方法是什么?

时间:2014-04-01 16:39:27

标签: java exception error-handling

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;
}

编辑: 另外,在第二种方法中,您可以使用RuntimeException(或自定义错误)区分内部方法错误,这是个坏主意吗?

3 个答案:

答案 0 :(得分:1)

我不认为"对"方式是这3个中的任何一个。

Java只有一个例外,名为IllegalArgumentException的无效参数,实际上是RuntimeException,所以你不要声明它。这个想法是,如果你提供一个非法的参数,这是调用方的一个错误,所以调用者必须捕获并处理异常。

当您的方法返回"非法"的有效结果时论证,IMO,你的论点并不是非法的,所以不应该是一个例外,然后就没有什么可以从中恢复的。因此,您的代码应该看起来像

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

这里没有例外。

现在,如果null参数是您必须处理的特殊情况,我认为正确的方法是在调用方处理它。在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. 如果null arg是一种例外情况,不是您的方法所期望的,那么它就是一个错误,您必须在被调用的方法之外从中恢复。如果被调用的方法可以处理null arg(例如返回一些有效值,例如" ko")那么它不是一个例外的情况,而只是一个有效的参数,其中有'这是一个有效的结果,所以这里不需要例外。
  2. 否则,您必须抛出异常(显式或非显式)并让调用者处理它
  3. 这就是我的想法。

答案 1 :(得分:0)

第一个,使它更优雅,但第三个更容易阅读,更不容易出错。

答案 2 :(得分:-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;
}