java捕获子程序异常,异常处理的一些理解

在编程过程,经常遇到的一个问题是如何优雅地处理异常。下面给出一些对这个问题的答案。

异常处理定义

异常处理,是编程语言或计算机硬件里的一种机制,用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件)。

异常处理与错误检测的区别

错误检测与异常处理区别在于:错误检测是在正常的程序流中,处理不可预见问题的代码,例如一个调用操作未能成功结束。

某些编程语言有这样的函数:当输入存在非法数据时不能被安全地调用,或者返回值不能与异常进行有效的区别。例如,C语言中的atoi函数(ASCII串到整数的转换)在输入非法时可以返回0。在这种情况下编程者需要另外进行错误检测(可能通过某些辅助全局变量如C的errno),或进行输入检验(如通过正则表达式),或者共同使用这两种方法。

通过异常处理,我们可以对用户在程序中的非法输入进行控制和提示,以防程序崩溃。从进程的视角,硬件中断相当于可恢复异常,虽然中断一般与程序流本身无关。从子程序编程者的视角,异常是很有用的一种机制,用于通知外界该子程序不能正常执行。如输入的数据无效(例如除数是0),或所需资源不可用(例如文件丢失)。如果系统没有异常机制,则编程者需要用返回值来标示发生了哪些错误。

异常处理的原则

为了更好的处理异常,应遵循以下三个原则:

具体明确

提早抛出

延迟捕获

具体明确

捕获异常时具体明确有利于对异常进行恰当的处理。例如在Java中对同一try块定义多个catch块,以便对每种异常分别进行恰当的处理:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20File prefsFile = new File(prefsFilename);

try{

readPreferences(prefsFile);

}

catch (FileNotFoundException e){

// alert the user that the specified file

// does not exist

}

catch (EOFException e){

// alert the user that the end of the file

// was reached

}

catch (ObjectStreamException e){

// alert the user that the file is corrupted

}

catch (IOException e){

// alert the user that some other I/O

// error occurred

}

提早抛出

异常堆栈信息提供了导致异常出现的方法调用链的精确顺序,包括每个方法调用的类名,方法名,代码文件名甚至行数,以此来精确定位异常出现的现场。例如:

1

2

3

4

5

6

7java.lang.NullPointerException

at java.io.FileInputStream.open(Native Method)

at java.io.FileInputStream.(FileInputStream.java:103)

at jcheckbook.JCheckbook.readPreferences(JCheckbook.java:225)

at jcheckbook.JCheckbook.startup(JCheckbook.java:116)

at jcheckbook.JCheckbook.(JCheckbook.java:27)

at jcheckbook.JCheckbook.main(JCheckbook.java:318)

通过逐步回退跟踪堆栈信息并检查代码,可以确定错误原因。

延迟捕获

捕获异常后怎么处理?最不该做的就是什么都不做。空的catch块等于把整个异常丢进黑洞,能够说明何时何处为何出错的所有信息都会永远丢失。把异常写到日志中还稍微好点,至少还有记录可查。但我们总不能指望用户去阅读或者理解日志文件和异常信息。

因此,不要过早捕获异常,而是在合适的层面捕获异常,以便你的程序要么可以从异常中有意义地恢复并继续下去,而不导致更深入的错误;要么能够为用户提供明确的信息,包括引导他们从错误中恢复过来。如果你的方法无法胜任,那么就不要处理异常,把它留到后面捕获和在恰当的层面处理。

参考链接异常处理,by wikipedia.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值