第7章 结构化异常处理
- 格式:ppt
- 大小:1.55 MB
- 文档页数:21


java异常处理机制
Java的异常处理是结构化编程的一个重要方面。
它提供了一种通用的方式来处理发生在应用程序或系统中的异常,比在代码中添加报错信息更有效。
Java异常处理模型包括异常类,异常处理器,throw和throws关键字以及堆栈跟踪。
异常类是Java的一种特殊类,它表示程序的异常状态(或者是错误情况)。
它从Java的Throwable类继承,Throwable类有两个子类,Exception和Error,它们派生出一组定义在Java中的异常。
异常处理器允许处理一个或多个特定类型的异常,是程序中处理异常的机制。
异常处理器通常作为程序的一部分,程序员可以通过编写异常处理器来为应用程序创建一个可以处理未知错误的安全环境。
Throw和throws关键字用于抛出异常。
Throw关键字用于将异常抛出到当前函数的调用点,throws关键字用于声明哪些异常可以被抛出,以便该方法的调用者可以捕获和处理它们。
堆栈跟踪是一种异常处理工具,可以展示异常期间应用程序运行的具体位置,同时可以追踪嵌套方法调用,并可以提供出现异常时的参数值,类型等等。
Java的异常处理机制为程序员提供了一种有效的处理在程序的运行过程中可能会发生的系统或应用程序异常的方法。
它可以保护应用程序免受非正常状况的危害,提高程序的安全性和效率。
计算机除0错误处理机制
比如计算上的除0错误,被认为应用有一个同样底层的机制去处理它们,而不是异常。
这让C++在涉及到算术领域的性能,可以和其它语言竞争。
再者,它也避免了当某些事件,比如除0错是异步的情况下(译者注:比如在别一个线程里发生)所可能造成的‘管道重重’的架构这一问题。
”
所以,说起来,和原生数组访问越界为什么不是一异常并无两样,主要还是为了“效率/性能”。
对于大多数时候的除法操作,我们会让它出现除数为0的可能性很小,当你认为有这种可能,就自己检查吧,然后自己定义一个除0错的异常。
很多C++库,还是实现了EDivByZero之类异常,但仅限于这个库里的代码。
它们做了检查。
总结一下:C++为什么抓不到除0错的“异常”?答:因为C++标准眼里,除0错不是一个异常。
再进一步:C++编译器,在编译除法操作时,没有为它加上额外的检查代码以抛出一个异常;也没有要求处理不同OS之间对(已经发生的)除0错的处理。
另一个原因是,简单化,比如如果要判断除0错,浮点数如何判断呢?
说到底,在事情发生之前,判断一下不是更好?
我猜测(基于对VC的基本信任,也基于我的懒惰),VC也不会执行07行代码。
VC里要抓这样的异常,需要采用操作系统的结构化异常。
它的代码需要使用 __try/__except来处理。
或者需要在编译选项上,加上让C++异常支持SEH(结构化异常处理)的参数。