1. 异常处理的打包及自定义异常类
ACMEPort port = new ACMEPort(12);
try {
port.open();
} catch (DeviceResponseException e) {
reportPortError(e);
logger.log("Device response exception", e);
} catch (ATM212UnlockedException e) {
reportPortError(e);
logger.log("unlock exception", e);
} catch (GMXError e) {
reportPortError(e);
logger.log("Device response exception", e);
} finally {
...
}
重复的代码就是坏味道,为了代码结构更为清晰,有两处修改方向:
- 将重复的异常处理,打包成一个类的成员函数;
自定义异常类 PortDeviceFailure,其构造函数接受(DeviceResponseException、ATM212UnlockedException、GMXError 具体异常类的)父类(如 ACMEException)引用;
LocalPort port = new LocalPort(12); try { port.open(); } catch (PortDeviceFailure e) { reportPortError(e); logger.log(e.getMessage(), e); } public class LocalPort { private ACMEPort innerPort; public LocalPort(int portNum) { innerPort = new ACMEPort(portNum); } try { innerPort.open(); } catch (DeviceResponseException e) { throw new PortDeviceFailure (e); } catch (ATM212UnlockedException e) { throw new PortDeviceFailure (e); } catch (GMXError e) { throw new PortDeviceFailure (e); } } public class PortDeviceFailure extends Exception { private ACMEException acmeExce; public PortDeviceFailure (ACMEException exce) { acmeExce = exce; } public String getMessage () { return ....; } }