Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 359|回复: 0

【Java学习笔记】自定义Java异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-5-22 06:53:08 | 显示全部楼层 |阅读模式

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    1.前言:

    你的程序总有一天会崩溃掉,在崩溃掉的时候我们要知道它在哪,为了什么而崩溃掉,数据的保存或者丢失情况如何等问题。我们可以通过继承类java.lang.Throwable的子类:Exception来设计我们自己的Java异常。Exception类用于描述程序能够捕获的异常,如ClassNotFoundException。要注意的是自定义异常类之间也可以有继承关系,同时也需要为自定义异常类设计构造方法,以方便构造自定义异常对象。

    2.设计实例分析:
    这是个比较完整的自定义异常类的设计,其实是比较模板化的东西。

    package playground;
    import java.io.*;

    public class MyException extends Exception {
      private int id; // a unique id
      private String classname; // the name of the class
      private String method; // the name of the method
      private String message; // a detailed message
      private MyException previous =
       null; // the exception which was caught
      private String separator = "/n"; // line separator
      public MyException(int id, String classname, String method,
        String message, MyException previous) {
        this.id        = id;
        this.classname = classname;
        this.method    = method;
        this.message   = message;
        this.previous  = previous;
      } 
      public String traceBack() {
        return traceBack("/n");
      }

      public String traceBack(String sep) {
        this.separator = sep;
        int level = 0;
        MyException e = this;
        String text = line("Calling sequence (top to bottom)");
        while (e != null) {
          level++;
          text += line("--level " + level + "--------------------------------------");
          text += line("Class/Method: " + e.classname + "/" + e.method);
          text += line("Id          : " + e.id);
          text += line("Message     : " + e.message);
          e = e.previous;
        } 
        return text;
      }

      private String line(String s) {
        return s + separator;
      }

    }

    我们来一个个看看这些东西:
    在这个继承了Exception类的自定义异常类中,我们定义了如下变量:
    id:独立标示符,这个是用来进行标示类中什么地方出现了错误被捕捉到。
    classname:捕捉到这个错误的类的名字。
    method:捕捉到这个错误的方法的名字。
    message:用来描述整个事件的情况。
    previous:是MyException得一个实例,若在链表中它是第一个的话,那么它就是null。

    我们再看看都定义了什么方法:
    traceBack():产生一个包含在异常类中存储的数据的一个回溯。使用newline标示作为分隔符
    traceBack(String sep):和上一个其实是相同的东西,使用的分隔符可以自己定义。
    line(String s):traceBack使用的一个方法。

    步骤一:先扔出第一个异常:
    这有两种情况:
    a.若程序判断异常的某个地方主动抛出异常,那么你就会主动抛出一个错误,例如:
    throw new MyException(  1, "Person", "getSalary",
      "Trying to get a salary, but no person was specified",null);

    b.在另一个异常出现时抛出该异常,例如:
    catch (Exception e) {
      throw new MyException(4, "Person", "read", e.toString(), null);
    }

    要是某一个方法要抛出MyException异常,那么在方法定义的时候形式如下:
    public void read() throws MyException . . .

    步骤二:接着我们扔出来的异常,例如:
    Person p = new Person();
    p.setPersonId(id);
    try {
      p.read();
      s += p.getSalary();

    catch (MyException e) {
      throw new MyException(1, "Stats", "getAllSalaries",
        "Could not get salary for " + id, e);
    }

    我们的策略是这样的:将我们可能扔出异常的方法置于我们的监控之下(try{}),然后出了事情我们在处理区(catch{})把这个异常处理,至于处理的方式可以是当场处理,也可以处理不了交予其他地方处理(throw())。需要注意的是,我们看到最后一个参数e,我们要在每个新的异常处将这个异常加入到异常类的链表中。

    步骤三:回溯异常
    我们上边设计的这个异常最后得出的一个异常链如下:
    Calling sequence (top to bottom)
    --level 1--------------------------------------
    Class/Method: SalaryServlet/doGet
    Id : 7
    Message : Trying to get the total salary for employees
    --level 2--------------------------------------
    Class/Method: Stats/getAllSalaries
    Id : 1
    Message : Could not get salary for Lincoln
    --level 3--------------------------------------
    Class/Method: Person/read
    Id : 3
    Message : java.sql.SQLException: [HANSEN]Invalid object name 'xEMPLOYEE'.
    --level 4--------------------------------------
    Class/Method: Person/read
    Id : 999
    Message : SQLException. State/error code: S0002/208

    我们可以分析得知在这个场景上,一个servlet被触发了,它调用了getAllSalaries,然后又调用了read方法,在read方法中,出现了一个SQLException

    3.总结:
    自定义异常类给了我们自己喜欢的异常的出现,其他的也没什么。哈哈~

     

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-3 02:47 , Processed in 0.059500 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表