1996年6月,阿丽亚娜5号火箭进行了第一次发射。火箭发射后37秒自毁,导致任务失败,损失约3.7亿美元。故障调查小组最终发现,是由数据转换而导致整数溢出造成的异常。由此看来,提前预判出异常并进行处理对于系统的正常运行是多么重要。

不管是小白还是大神,异常总是程序员无法避免的一个话题。尤其是刚入门编程的程序员,一出现异常就不知道如何应对,非常容易慌乱。

那么什么时候才会出现异常呢?只有在当前的环境下程序无法正常运行下去,程序已经无法来正确解决问题了,异常才会从当前环境中跳出来。在实际编程中,异常出现的情形总是不期而至:文件不存在或者格式不对、网络连接失败、内存或硬盘满了等等。

一、异常的体系

首先我们可以明确一点,就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率。虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位和作用。接下来,我们先通过一张图来了解下Java异常的体系结构。

从上面这幅图可以看出,Java标准库内建了一些通用的异常,Throwable是这些类的顶层父类。Throwable又派生出Error和Exception。

Error及其子类代表非程序异常,不能被程序员通过代码处理。由于Error一般是系统性的错误,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程,所以程序员不用试图去捕获Error引发的异常状况。

Exception及其子类代表程序本身可以捕获并且可以处理的异常。可以被Java异常处理机制使用,是异常处理的核心。根据编译器对异常的检查情况,又将Exception的子类分为运行时异常(RuntimeException)和编译期异常(CheckedException)。

运行时异常:在编译期不会提示和发现这样的异常,这样的异常发生的原因多半是代码写的有问题,比如:使用了空对象而引发的NullPointerException。对于RuntimeException这样的异常,我们应该修正代码来进行处理。

编译期异常:都是可以在编译阶段被处理的异常,比如:可能会产生I/O错误时的IOException。Java认为CheckedException都是可以在编译阶段被处理的异常,所以程序会强制要求预先处理所有的CheckedException,否则编译不会通过。

二、异常的处理

编程语言觉得尽量在程序员犯错的时候“恶心”一下程序员,“逼着”他们去处理异常。Java异常的处理主要依赖于try、catch、finally、throws、throw这五个关键字,一般来说我们会使用try…catch…finally语句块进行异常处理,或者在方法签名中使用throws 声明,“不负责任的”的让方法调用者自己去解决。

1.异常“终结者”try,catch

使用try-catch语句块可以捕获异常并进行处理,try-catch-finally的常规语法如下:

try{
//可能会出现异常的程序代码
语句1;
语句2;
语句3;
}catch(异常类型 e) {
//捕获并处理异常或者使用throw抛出异常
}finally{
//必执行的代码
}
语句4;
语句5;

当try代码块中没有出现异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句。

当try代码块中出现异常时:try语句块中的异常语句之后的代码将被忽略,程序将直接跳到catch语句块。

如果catch语句块中捕获到了异常进行处理,会在catch语句块执行后接着执行finally语句块和其后的语句。如果没有捕获到异常或者使用throw抛出了异常,在catch语句块执行后接着只会执行finally语句块,但finally语句块后的语句不会被执行。

2.“不负责任”的throws

throws是另一种处理异常的方式。如果方法内没有捕获和处理异常,而是通过throw抛出了编译期异常,那么必须通过throws进行声明。throws运用于方法声明之上,表示当前方法不处理异常,而是提醒该方法的调用者来处理异常。

声明异常格式如下:

修饰符 返回值类型 方法名(参数)throws异常类名1,异常类名2…{

采取这种异常处理的原因可能是:方法本身不知道如何处理这样的异常,或者说让调用者处理更好,调用者需要为可能发生的异常负责。

3.自定义异常

在复杂业务环境下,Java自带的异常可能满足不了我们业务的需求,这个时候我们可以自定义异常来进行对业务异常的处理。自定义异常都应该继承Exception基类,如果希望自定义运行时异常,则应该继承RuntimeException。

定义自定义异常时通常需要提供2种构造器:一个是无参数的构造器;另一个是带一个字符串参数的构造器,这个字符串将作为该异常对象的详细说明。语法格式如下:

public class Register Exception extends Runtime Exception {
/*** 空参构造 */
public Register Exception() {
} /**** @param message 表示异常提示 */
public Registe rException(String message) {
super(message);
}
}

作为一名合格的程序员,我们不仅需要学会如何挑选格子衬衫,还需要在疯狂的coding中锻炼出更多的肌肉,以便随时应对前来改需求的产品经理,更重要的就是要做到对常见异常有一些印象,在真正遇到时知道去哪找API并且优雅的处理掉异常。

python try catch 能知道是哪一行代码_能导致3.7亿美元损失的异常,到底是怎么回事?...相关推荐

  1. python怎么返回上一行代码_一行Python代码能做出哪些神器的事情

    原标题:一行Python代码能做出哪些神器的事情 (1)一行代码启动一个Web服务 python -m SimpleHTTPServer 8080 # python2 python3 -m http. ...

  2. 用Python制作动态二维码,一行代码就做到了

    如何做到用一行代码实现动态二维码的制作? 用法比较简单,直接通过pip安装即可 pip3 install myqr 安装完成之后,就可以生成你想要的二维码了.对!就是这么简单- 普通的二维码 直接执行 ...

  3. 钉钉一行代码_利用Python快速搭建钉钉和邮件数据推送系统

    前面的文章我们写到了利用Python实现钉钉和邮件的数据推送,在数据处理这一块实现了对mysql和odps的数据获取和处理,可以满足常规业务大部分数据场景需求,在一家初创公司数据基础建设还不完善的时候 ...

  4. python如何获取股票数据_Python|一行代码获取股票数据

    随着金融行业的发展,金融相关的数据变得越来越有价值.股票的历史数据就是一种非常重要的时间序列数据,本文介绍一个不需要自己动手写爬虫就能够获取各个公司的股票信息的Python库--yfinance. 0 ...

  5. python一行代码_一行有效python代码

    完成同样的功能,尽量少写代码 伊始 今天跟大家分享几个有趣的kata,刚开始做这几个kata的时候,我也写了很长的代码才完成,随着后来对python的深入接触,发现python一些简单却十分强大的特性 ...

  6. python统计程序运行时间-如何方便地统计 Python 程序每一个函数、每一行代码执行所花的时间?...

    当然是用 line_profiler 堪称神器 贴个官方例子片段 这个功能应该是你想要的吧: Line # Hits Time Per Hit % Time Line Contents ======= ...

  7. python回声程序echo 一行代码_回声状态网络法echo state network代码(简单)

    [实例简介] esn作者在官网的简单版代码,给英文不好的同学拿过来,免得再去找地方下载 [实例截图] [核心代码] ESN_Toolbox └── ESN_Toolbox ├── analogToUn ...

  8. python语言编写一个生成九宫格图片的代码_用Python一键生成炫酷九宫格图片,火了朋友圈...

    作为一个男同胞来说,为了给女朋友拍一张美美的照片,着实需要花费很大的时间和精力,不仅仅需要从众多的图片中精心挑选,而且还需要有着超强的图片精修能力,才能得到一张张达到女友要求的图片,真心不容易啊- 朋 ...

  9. python中返回上一步操作的代码_【代码学习】PYTHON字符串的常见操作

    一.字符串运算符 下表实例变量 a 值为字符串 "Hello",b 变量值为 "Python": 操作符描述实例 + 字符串连接 >>>a+ ...

最新文章

  1. MFC中利用CFileDialog选择文件并读取文件所遇到的问题和解决方法
  2. UC伯克利给四足机器人加Buff:瞬间适应各种真实地形,抹了油的地面也能hold住...
  3. ERROR: missing Change-Id in commit message footer
  4. Python 父目录获取
  5. iOS开发NSDate、NSString、时间戳之间的转化
  6. 监督管理计算机系统的安全保,网络信息安全知识:监督管理计算机信息系统安全保护工作应由()完成。...
  7. IDEA 修改文件编码
  8. k2450 linux 显卡驱动,Debian系统安装NVIDIA驱动支持双显卡切换
  9. OpenCV 5种图像滤波辨析:方框、均值、高斯、中值、双边
  10. 孩子总是偷偷玩游戏,家长该怎么办?
  11. GNSS/INS组合导航(2)-加速度计选型参数解析
  12. winPE下安装系统ghost恢复系统图文详细教程
  13. 【问题解决】springboot启动后一小会就自动停止,提示Process finished with exit code 0
  14. 大数据开发就业:大数据开发有哪些岗位
  15. system32里的文件说明
  16. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
  17. Android仿支付宝咻一咻动画
  18. 什么是深度链接(deep link)
  19. 计算机专业英语短语,计算机常用专业英语缩写和短语
  20. 零基础学习设计模式之装饰器模式(配套视频)

热门文章

  1. python gps模块_一步一步使用uPyCraft学习MicroPython之GPS记录器
  2. shell swt 样式_swt shell设置窗口位于屏幕中间
  3. java 取整_javascript 解决默认取整的坑(目前已知的最佳解决方案)
  4. 如何保存一个函数_如何表达一个“分段函数”之学习Matlab Function模块
  5. Class.forName()的作用与使用总结
  6. Pandas与openpyxl库的 完美 融合!
  7. Java?Python?Let us GO!
  8. 绝对牛逼的3套Python项目,就业/毕设/私活/女朋友都不愁了
  9. bootstrap中表格大小设置_bootstrap 设置table - td宽度问题
  10. else if mybatis 嵌套_新手如何书写C++代码,远离深度嵌套的if-else