java异常—异常处理模板
一.使用异常模版原因
有时候一个完整的异常处理起来可能非常繁琐,使得代码非常混乱且难以阅读,比如下面的一段代码:
Input input = null;
IOException processException = null;
try{
input = new FileInputStream(fileName);
} catch (IOException e) {
processException = e;
} finally {
if(input != null){
try {
input.close();
} catch(IOException e){
if(processException != null){
throw new MyException(processException, e,
"Error message..." +
fileName);
} else {
throw new MyException(e,
"Error closing InputStream for file " +
fileName;
}
}
}
if(processException != null){
throw new MyException(processException,
"Error processing InputStream for file " +
fileName;
}
在上面示例中,不会丢失任何异常信息。如果从try块中抛出异常,并且从finally块中的input.close()调用中抛出另一个异常,则两个异常都保留在MyException实例中,并在调用中向上传播。但是这段复杂的代码却只处理IO异常,为了让代码更简单,我们可以使用模版进行处理。
二.异常模版使用
我们将上面代码改为用异常模版处理方式,首先创建一个异常模版,代码如下:
public abstract class InputStreamProcessingTemplate {
public void process(String fileName){
IOException processException = null;
InputStream input = null;
try{
input = new FileInputStream(fileName);
doProcess(input);
} catch (IOException e) {
processException = e;
} finally {
if(input != null){
try {
input.close();
} catch(IOException e){
if(processException != null){
throw new MyException(processException, e,
"Error message..." +
fileName);
} else {
throw new MyException(e,
"Error closing InputStream for file " +
fileName;
}
}
}
if(processException != null){
throw new MyException(processException,
"Error processing InputStream for file " +
fileName;
}
}
public abstract void doProcess(InputStream input) throws IOException;
}
所有异常处理都可以封装在InputStreamProcessingTemplate类中。该模版的使用方法如下:
new InputStreamProcessingTemplate(){
public void doProcess(InputStream input)抛出IOException {
int inChar = input.read();
while(inChar! - -1){
//
}
}
} .process( “someFile.txt”);
这样我们可以轻松修改模板以适用于所有输入流。