捕获和抛出异常

package com.exception.demo01;

/**
 * @ClassName: Demo01
 * @Author: 南冥有猫不须铭
 * @Date: 2021/4/27-0:48
 * @Description: Error和Exception
 */
public class Demo01 {

    public static void main(String[] args) {
        new Demo01().a(); //new一个匿名内部类  //StackOverflowError

        System.out.println(11/0); //ArithmeticException
    }

    //错误(Error) 递归循环依赖
    public void a(){
        b();
    }
    public void b(){
        a();
    }
}

package com.exception.demo01;

/**
 * @ClassName: Test
 * @Author: 南冥有猫不须铭
 * @Date: 2021/4/27-23:57
 * @Description: 捕获和抛出异常
 */
public class Test {

    public static void main(String[] args) {

        try { // 一般情况下遇到异常,程序会停止,加了try、catch捕获之后,程序会正常地继续执行下去
            new Test().test(1,0);
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
    }

    //假设这个方法中,处理不了这个异常。 在方法上抛出异常(throws)
    public void test(int a,int b) throws ArithmeticException{
        if(b==0){ //throw  throws
            throw new ArithmeticException();//主动地抛出异常,一般在方法中使用(throw)
        }
        System.out.println(a/b);
    }

        /*
        //假设要捕获多个异常: 从小到大!

        try {   //try 监控区域  (代码块)    try中的代码出现异常,捕获区域就会去捕获异常

            //System.out.println(a/b); // ArithmeticException异常 ---> "程序出现异常,变量b不能为0"

            //new Test().a(); // StackOverflowError错误

        }catch(Error e){  //catch(想要捕获的异常类型 _)    捕获异常,若出现异常,执行代码块中内容
            System.out.println("Error");
        }catch (Exception e){
            System.out.println("Exception");
        }catch (Throwable t){ // Throwable ---> 最大的异常(包括Error和Exception)     写catch捕获异常时,要把最大的异常放在最下面(小的异常在上面,层层递进)
            System.out.println("Throwable");
        } finally { //finally 处理善后工作 (无论程序出不出异常,都要执行finally中的内容)
            System.out.println("finally");
        }
         */

        //finally 可以不要,但try 、catch 一定要有
        //finally:假设一些IO流,或者和资源相关的东西,关闭操作 放在finally中(善后)


    /*
    public void a(){ //互相调用 错误
        b();
    }
    public void b(){
        a();
    }
    */


}

package com.exception.demo01;

/**
 * @ClassName: Test2
 * @Author: 南冥有猫不须铭
 * @Date: 2021/4/28-1:34
 * @Description: 捕获和抛出异常
 */
public class Test2 {
    public static void main(String[] args) {
        int a = 1;
        int b = 0;

        //快捷键:(选中代码后)Ctrl + Alt + t --->  选择对应的方法(try/catch/finally),自动包裹代码
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            System.exit(1); // 可以自己加逻辑判断,让程序结束
            e.printStackTrace(); //打印错误的栈信息
        } finally {
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前言 本程序基于东灿的异常调试模块5.2部分版权信息如下: 1. 该模块功能是补足易错误管理器无法捕捉的异常。 2. 本模块可以截获许多异常,比如内存读写错误,非法汇编指令,算术异常,其他异常等等。 3. 本模块拥有try/catch的异常处理模型,支持多层嵌套,支持向上处理。允许用户自己设定跳过致命异常。 4. 并且支持易原错误管理器接管 5. 建议配合配套工具使用更加好用 正文: 程序原使用模块: 模块名 作者或工作室 用处 高级ApiHookEx 作者未知 HookApi,在模块中用于Hook:CreateRemoteThreadEx和CreateRemoteThread AppThreadVar 作者未知 进程内变量,线程内变量。可以在任意ec模块,任意DLL内调用,全部共享 callstack 作者未知 函数调用堆栈跟踪。 disasm 作者未知 支持MMX/SSE/SSE2/SSE3/3DNow取CPU指令长度 GetThisModuleHandle 作者未知 取出当前ModuleHandle e-try/catch(即new_SEH) 星锋工作室-东灿 SEH结构体等 精简内容 简化模块(即多模块合一,但互相不影响,并且删去了重复的API,数据类型等) 增加注释:对于代码,追加了更多的注释。 部分原理理解(很多都是本人自己的理解,可能不对,若有错误,欢迎指出):AppThreadVar:工作核心:tls线程局部存储(缩写为TLS。进程中的全局变量与函数内定义的静态(static)变量,是各个线程都可以访问的共享变量。在一个线程修改的内存内容,对所有线程都生效。这是一个优点也是一个缺点。说它是优点,线程的数据交换变得非常快捷。说它是缺点,一个线程死掉了,其它线程也性命不保; 多个线程访问共享数据,需要昂贵的同步开销,也容易造成同步相关的BUG。) 部分功能:它主要是为了避免多个线程同时访存同一全局变量或者静态变量时所导致的冲突,尤其是多个线程同时需要修改这一变量时。为了解决这个问题,我们可以通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。而从全局变量的角度上来看,就好像一个全局变量被克隆成了多份副本,而每一份副本都可以被一个线程独立地改变。 用途:动态TLS和静态TLS这两项技术在创建DLL的时候更加有用,这是因为DLL通常并不知道它们被链接到的应用程序的结构是什么样的。1. 如果应用程序高度依赖全局变量或静态变量,那么TLS可以成为我们的救生符。因而最好在开发中最大限度地减少对此类变量的使用,更多的依赖于自动变量(栈上的变量)和通过函数参数传入的数据,因为栈上的变量始终都是与某个特定的线程相关联的。如果不使用此类变量,那么就可以避免使用TLS。2. 但是在编写应用程序时,我们一般都知道自己要创建多少线程,自己会如何使用这些线程,然后我们就可以设计一些替代方案来为每个线程关联数据,或者设计得好一点的话,可以使用基于栈的方法(局部变量)来为每个线程关联数据 TLS分动态和静态,AppThreadVar我认为是动态TLS(调用了TlsAlloc函数) 相当于静态变量(我也只能理解到这里了) ApiHookEx和大部分的APIHook工作原理类似 e-try/catch说实话,这个模块我几乎不能理解原理(能理解的基本上是一些Api,比如MiniDumpWriteDump) 这个可能也是用于捕获异常,而且比较神奇的是,这个捕获异常以后不会导致程序的退出,而是程序能够正常运行! 可以抛出自定义数值异常,由catch_int/catch_eq_int接收 可以抛出最后一次异常,让上层错误处理器处理 部分实例: try/catch测试:try/catch结果: 部分崩溃代码测试: 结果部分: 程序可以自己写出DMP文件: 更多功能请自己测试!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值