java异常二(异常处理模板)

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”);

这样我们可以轻松修改模板以适用于所有输入流。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值