3

I have a method which is getting an exception as a parameter to a particular method. This method needs to do perform different logic based on the type of exception. Between below two ways of handling this.. what is the most efficient way (is there a third better way).. and why

public void processException(Exception ex) {
   try {
      throw ex;
   } catch(CustomException e1) {
      //do something
   } catch (CustomException2 e2) {
      //do something else
   }
}

or

public void processException(Exception ex) {
   if (ex instanceof CustomException) {
      // do something
   } else if (ex instanceof CustomException2) {
      // do something else
   }
}
4

4 回答 4

7

抛开效率不谈,第二种方式是首选,因为在非异常情况下不会抛出异常。“调度”的第一种方法是在常规控制流中使用异常抛出,这使得程序更难阅读。

此外,这两种方法并不完全相同:第一个程序必须声明为抛出检查异常,因为并非所有子类型都由catch块处理。

如果您正在处理程序定义的自定义异常,则有一种方法可以避免检查子类型:由于Exception对象是常规类,您可以向它们添加一个包可见的方法,并让它们实现一个包可见的接口,该接口包含方法。然后异常将能够覆盖该方法,让您使用常规的“虚拟”调度,而不是在运行时检查确切的类类型。

这是这种方法的一个说明:假设您希望您的异常将自己写入日志文件。您可以按如下方式执行此操作:

interface LoggableException {
    void logToFile();
}
public class CustomExceptionOne extends Exception implements LoggableException {
    ...
    public void logToFile() {
        // Do something
    }
}
public class CustomExceptionTwo extends Exception implements LoggableException {
    ...
    public void logToFile() {
        // Do something else
    }
}
public void processException(Exception ex) {
    if (ex instanceof LoggableException) {
        LoggableException lEx = (LoggableException)ex;
        lEx.logToFile();
    }
}
于 2013-07-31T16:40:38.477 回答
4

第一个是一个非常糟糕的主意。逻辑不应表示为异常捕获。无论您是否意识到,它们都很昂贵。

第二个我也不喜欢 当您看到 if/else 逻辑时,您应该考虑多态性。

于 2013-07-31T16:40:48.647 回答
2

显然第二种选择更好。所有的异常最终都是对象,最好、更安全并建议执行检查实例以确定对象的类型。

于 2013-07-31T16:42:45.790 回答
1

抛出和捕获异常是昂贵的操作,只应在特殊情况下发生。此外,您处理异常的方法可能正在被调用,因为异常已经被抛出。我不会再扔了。

instanceof 或 rgettman 建议的重载 processException 。另一种选择是

public void processException(Exception e) {
    Class eClass = e.getClass();
    if (eClass == CustomeException.class) { // This exception is most likely.
        // do something
    } else if (eClass == CustomException2.class) {
        // do something
    } else if (eClass == CustomException3.class) {
        // do something
    } else if (eClass == CustomException4.class) {
        // do something
    }
}

if/else if我建议用最有可能的异常类来短路语句。

于 2013-07-31T16:51:29.047 回答