动力节点首页 全国咨询热线:400-8080-105

绑定手机号,登录
手机号

验证码

微信登录
手机号登录
手机号

验证码

微信登录与注册
微信扫码登录与注册

扫码关注微信公众号完成登录与注册
手机号登录
首页 > 文章

异常处理的两种基本模型:终止模型和恢复模型

05-28 15:55 1005浏览
举报 T字号
  • 大字
  • 中字
  • 小字

理论上异常处理划分为两个模型(中止模型与继续模型),但实际使用方面我们对中止模型用的比较多,这个模型比较实用,而继续模型则不是那么的应用普遍,多少是耦合的过于紧密。

中止模型 :

假设错误非常严重,已至你无法在回到错误发生的地方,也就是说,这段程序经过判断认为,他已经没有办法挽回,于是就抛出异常,希望这个异常不要在回来,这也是Java 当前所采用的模式。长久以来,尽管程序员们使用的操作系统支持恢复模型的异常处理,但他们最终还是转向使用类似“终止模型”的代码,因为这样可以编写出更加通用性的代码。

public class StopGenteelly {
    public static void main(String[] args) throws InterruptedException {
        TwoPhaseTermination tpt = new TwoPhaseTermination();
        tpt.start();
        Thread.sleep(100);
        tpt.stop();
    }
}

class TwoPhaseTermination{
    private Thread thread;

    public void start(){
        thread = new Thread(()->{
            while (true){
                if (thread.isInterrupted()){
                    System.out.println("线程被中断,结束线程");
                    break;
                }

                try {
                    System.out.println("做一些工作。。。");
                    Thread.sleep(1000); //在这里中断,会抛出InterruptedException
                } catch (InterruptedException e) {//中断标记会被重置
                    e.printStackTrace();
                    thread.interrupt();
                }
            }
        });

        thread.start();
    }

    public void stop(){
        thread.interrupt();
        System.out.println("中断线程");
    }
}

继续模型:

这种模型的主旨是恢复当前的运行环境,然后希望能够重新回到错误的发生地,并希望第二次的尝试能够获得成功,这种模型通常为操作系统所应用。

不过值得一提的是“继续模型”也并非一无是处,在某些情况下采用“伪继续模型”依然可以起到对程序的恢复作用。具体方法就是把try块放在while循环里,这样就不断地进入try块,直到得到满意的结果。


    class MyException extends Exception{
        MyException(){}
        MyException(String msg){
            super(msg);
        }
    }
    public class LoopsException {
        private static int i=0;
        public void loopf(int f) throws MyException{
            if(i
            System.out.println("i too tiny");
            throw new MyException("Can't run");
        }else{
            System.out.println("i enough");
        }
    }
    public static void main(String[] args){
        LoopsException le=new LoopsException();
        while(true){
            try{
                le.loopf(15);
                System.out.println("i="+i);
                break;
            }catch(MyException e){
                e.printStackTrace(System.out);
            }
            i++;
        }
    }

 

0人推荐
共同学习,写下你的评论
0条评论
杨晶珍
程序员杨晶珍

98篇文章贡献357785字

相关课程 更多>

作者相关文章更多>

推荐相关文章更多>

Java面试题及答案整理

提枪策马乘胜追击04-21 20:01

Spring常见面试题

代码小兵92504-17 16:07

Java零基础实战项目——五子棋

代码小兵98804-25 13:57

Java string类详解

杨晶珍05-11 14:54

6道经典算法面试题

杨晶珍05-12 16:39

发评论

举报

0/150

取消