面向健壮性和正确性的构造(2)------技术篇之错误和异常处理

本文介绍了程序中的错误和异常处理机制,包括错误类型、处理方法、Java中的Error与Exception的区别及处理方式。探讨了如何通过异常处理提高程序的健壮性和正确性。

今天为大家带来的是技术篇中的错误和异常处理的相关知识介绍,希望对大家有所帮助哦

错误和异常处理

  • 通用的异常和处理错误
  • 错误
    • 这里的错误就是程序里面的所有异常情况
  • 错误的类型
    • 用户的输入错误
    • 设备错误,硬件错误
    • 硬件限制:硬盘满了,可用内存已经没有了
    • 代码错误:空指针,数组越界
  • 错误处理
    • 预先阻止
    • 错误中进行恢复
    • 优雅的退出
  • 处理错误
    • 告诉用户有错误
    • 保存工作
    • 返回到安全的状态并且保证用户处理其他的控制
    • 允许用户保存工作并且优雅的退出程序
    • 不好做 因为错误代码和错误条件可能有一定距离
  • 稍微具体点的方法
    • 返回中性值
      • 接着执行并且返回一个无害的值
      • 对于正确性要求高的不行
    • 替换下一组有效的数据
    • 返回和以前相同的答案
    • 用最接近的值来替代(健壮性)
    • 接着执行,跳过去,使用日志把警告信息记录下来(健壮性)
    • 返回错误代码:失败了以后告诉用户错误代码(正确性)
      • 缺点1:不够直观
      • 缺点2:错误代码对照表需要设置的很完善
    • 调用一个错误集中处理模块(正确性)
      • 好处:利于调试
    • 弹出窗口,直接显示错误信息(正确性)
      • 好处:直观
      • 缺点:存在大量的提示,管理比较困难
    • 局部解决错误
      • 好处:对于开发人员来说很灵活,在某个模块解决了
      • 缺点:处理不好可能散播到全局
    • 关机(正确性)
      • 宁可关机也不能以错误的方式接着执行

Java里错误和异常处理

  • Error
    • 描述运行时Java内部运行时候的错误,Java自身出现错误或者内存耗尽之类的,我们做不了任何事情,除了比较友好的退出之外
  • Exception
    • 自己程序里的错误
  • 异常处理
    • 主要作用:程序控制权把出现错误的代码转移到处理错误代码的代码
    • 出现异常之后会有一个可替代的路径而不是走正常路径
  • 好处是什么:
    • 不会忘记处理一个错误的模块
    • 提高更加高层的错误信息和堆栈追踪:可视化的错误展示
    • 提高代码的结构:把正常的代码和处理异常的代码进行分离
    • 易于提高健壮性和正确性
  • 异常分类(checked/unchecked
    • 运行时异常:
      • 程序里变成错误导致的:认真写程序是不应该抛出来的(程序员懒hhh
      • 类型转换,空指针,数组越界
      • it is your fault
    • 除了运行时异常的异常:
      • check 异常
      • 这是编译器要检查的
      • 无论哪个方法写出来的,是否有异常处理
  • checked异常处理
    • 关键字:try catch finally throws throw
    • 三个操作
      • 定义异常(throws
      • 抛出异常(throw
      • 捕获异常(try catch finally
    • 声明异常
      • 告诉编译器返回什么值也告诉编译器返回什么样的错误
      • 两种方法:
        • 抛出异常并解决
        • 只抛出异常,不处理,总有处理模块,没有的的话,编译器不通过
  • 抛出异常的四种情况
    • 调用某个方法,方法本身会抛出异常
    • 检测到一个错误,自己抛出一个异常
    • Java虚拟机会捕获异常然后跑出来(a[-1] = 0
    • 在虚拟机和运行时库产生的内部错误
  • 程序里面可以抛出unchecked 异常和Error ,但是前者自己能解决,后者抛出来也解决不了
  • 抛出来一定要处理!

怎么抛出一个异常

  • 抛出异常的两种方法
    • 方法 后面跟着 throw ..Exception 的声明;方法内部抛出异常(throw new …Exception()
    • 在异常类时候定义一个字符串,字符串传给异常
  • 怎么使用
    • 找到合适的异常类
    • 声明一个对象
    • 抛出
    • 不需要考虑返回值,遇到异常直接跳到捕获者那里进行处理 catch
  • 定义创建异常类
  • 定义的异常类 继承 Exception 就可以  绝大部分是为了记录是什么出错了,出错信息

怎么捕获和处理异常

  • try catch机制
    • Try 已经抛出异常 try之后代码被忽略到了
    • catch如果匹配try catch处理
    • 如果catch中没有匹配的 异常处理,被访问的程序退出
  • 将处理异常 交给调用者, 自己只是在方法中声明
  • 获得异常更加详细信息
    • 得到异常的处理信息
    • 得到异常对象的具体类型
  • 重新抛出异常
    • 在异常处理的catch里面声明一个新的类型的异常处理对象,用于改变异常的类型,对异常的信息进行重新封装

Finally clause

  • 不管异常是否抛出 是否被捕获 Finally中语句都会执行
  • 这里有四道例题 执行谁 不执行谁
  • catch一旦进行了正确的处理,try catch之后的代码可以继续正确的执行

Try with resources statement

  • try 调用一个资源 资源里面必须实现AutoCloseable接口,这样就不用写finally

分析异常信息

  • 方法调用的时候采用堆栈结构
  • 虚拟机 在这层程序里找处理方法,没有找到,按照进栈顺序,一层一层的往上找
  • 分析Stack Trace
    • 使用一个StackTraceElement 数组,然后进行analyze 的分析(analyze 数组名字)

使用异常

  • 异常处理不能代替简单的测试
  • 少一点细化异常,都放在一起进行处理
  • 利用好异常的层级结构
    • 异常越详细越好,不要只抛出最上层的异常 











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值