<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
理解error和exception之间的区别,学习如何对其进行处理
很多程序员不清楚error和exception之间的区别,这区别对于如何正确的处理问题而言非常重要(见附1,“简要的叙述error和exception”)。就像Mary Campione的“The Java Tutorial”中所写的:“exception就是在程序执行中所发生的中断了正常指令流的事件(An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions.)”依照美国传统辞典(American Heritage Dictionary)所解释的,error就是:“效果或情况背离了可接受的一般法则(The act or an instance of deviating from an accepted code of behavior.)”
背离(deviation)、中断(disruption),有什么区别呢?让我们来这样想:如果你驱车在公路上行驶时有人拦住了你,这就叫做“中断”。如果车根本就无法发动,那就叫做“背离”。
这与Java有什么关系呢?很多。Java中有一个相当有趣的error和exception的结构。
是的,非常正确:所有使用try{} catch(Exception e){}的代码块只能找到你一半的错误。但是,是否try并catch Throwable取决于你捕捉它的原因。快速的看一下Error的子类,它们的名字类似VirtualMachineError,ThreadDeath,LinkageError。当你想捕获这些家伙们的时候,你要确定你需要捕获它们。因为那些都是很严重的错误。
但是ClassCastException是一个error吗?不完全是。ClassCastException或任何类型的exception只是虚拟机(VM,VirtualMachine)让你知道有问题发生的方式,这说明,开发者产生了一个错误,现在有一个机会去修正它。
另一方面,error是虚拟机的问题(通常是这样,但也可能是操作系统的问题)。引用Java文档中关于error的说明:“Error是Throwable的子类,它的出现说明出现了严重的问题。一般应用程序除非有理由,否则不应该捕捉Error。通常这是非常反常的情况。”
所以,error非常强大,而且但处理它远比一般开发者想象的要难(当然不是你)。如果你在做一项很简单的工作的话,你认为有必要去处理error?
首先,记住,error跟exception抛出的方式大体相同的,只有一点不同。就是一个抛出error的方法不需要对此进行声明(换句话说,这是一个unchecked exception(也被称做Runtime Exception))。
public void myFirstMethod() throws Exception
//Since it's an exception, I have to declare
//it in the throws clause
{
throw new Exception();
}
public void mySecondMethod()
//Because errors aren't supposed to occur, you
//don't have to declare them.
{
throw new Error();
}
注意,有一些exception是不可控制的(unchecked exception),跟error的表现是一样的,如:NullPointerException,ClassCastException和IndexOutOfBoundsException,它们都是RuntimeException的子类。RuntimeException和其子类都是unchecked excception。
那应该如何处理这些令人讨厌的unchecked exception呢?你可以在可能出现问题的地方catch它们,但这只是一个不完整的解决方法。这样虽然解决了一个问题,但其余的代码仍可能被其他unchecked exception所中断。这里有一个更好的办法,感谢ThreadGroup类提供了这个很棒的方法:
public class ApplicationLoader extends ThreadGroup
{
private ApplicationLoader()
{
super("ApplicationLoader");
}
public static void main(String[] args)
{
Runnable appStarter = new Runnable()
{
public void run()
{
//invoke your application
(i.e. MySystem.main(args)
}
}
new Thread(new ApplicationLoader(), appStarter).start();
}
//We overload this method from our parent
//ThreadGroup , which will make sure that it
//gets called when it needs to be. This is
//where the magic occurs.
public void uncaughtException(Thread thread, Throwable exception)
{
//Handle the error/exception.
//Typical operations might be displaying a
//useful dialog, writing to an event log, etc.
}[/code:1]
这个技巧太棒了。想想这种情况,你对你的GUI程序进行了修改,然后一个unchecked exception被抛出了。并且你的GUI程序常常具有了错误的状态(对话框仍旧开着,按钮失效了,光标状态出现错误)。但是,使用这个技巧,你可以将你的GUI程序恢复原始状态并通知用户出现了错误。对自己感觉很棒吧,因为你写了一个高质量的应用程序。
这个技巧并不只适用于GUI程序。服务器端应用程序可以使用这个技巧来释放资源,防止虚拟机进入不稳定状态。较早的捕获错误并聪明的将其处理是好的程序员和普通程序员的区别之一。你已经明白了这些,我知道你想成为哪一类程序员。
[color=cyan]关于作者
Josh Street是Bank of America的构架设计师。他主要负责电子商务平台的开发。他的联系方式是rjstreet@computer.org。[/color]
简要的叙述error和exception
Error和Exception都继承自Throwable,他们下列不同处:
Exceptions
1. 可以是 可被控制(checked) 或 不可控制的(unchecked)
2.表示一个由程序员导致的错误
3.应该在应用程序级被处理
Errors
1.总是 不可控制的(unchecked)
2.经常用来用于表示系统错误或低层资源的错误
3.如何可能的话,应该在系统级被捕捉
分享到:
相关推荐
error和exception的详细介绍,彻底弄清这两者的关系与不同,帮助大家很好的使用
Java中Error和Exception的区别.pdf 学习资料 复习资料 教学资源
Replace Error Code With Exception
Java中Error与Exception的区别.doc
捕获Exception时,不会捕获error,像out of memory这种问题会在中间件的日志...捕获Throwable时,会捕获Exception和Error,像out of memory这种问题也会被捕获到,而程序对于这种Error没法进行处理,没有捕获的必要性。
第一,理解 Throwable、Exception、Error 的设计和分类 第二,理解 Java 语言中操作 Throwable 的元素和实践 第一,尽量不要
error与exception的区别查阅网上资料大多是java的解释,貌似php的异常处理过程与java差不多 java中的Object继承结构如下: Object—->Throwable——–> Exception —-> RuntimeException | Error Error都是unchecked...
Exception: 1.可以是可被控制(checked) 或不可控制的(unchecked)。 2.表示一个由程序员导致的错误。 3.应该在应用程序级被处理。
第一,理解 Throwable、Exception、Error 的设计和分类 第二,理解 Java 语言中操作 Throwable 的元素和实践 第一,尽量不要
深入理解java异常(异常中的Error+异常中的Exception+检查异常+运行时异常+异常处理+throws关键字等)
2. 运行时异常(RuntimeException) 3. 被检查的异常(Checked Exception) 1.增强程序堆内存的处理效率 2.设置缓存大小
OK:Elixir中优雅的errorexception处理,结果为monads
有开发板由Memtool烧录程序的Error,以及对应的解决办法,高手看过别喷哦,希望可以或多或少的帮到初学者,更希望可以和大家一起学习英飞凌MCU。 觉得好用或是过后Error没了的话,请评论下,让大家看得到,谢谢!
常用的java处理 网络JAVA的基本知识 和报错的处理方法
里面的内容是Unhandled event loop exception No more handles,当你点击OK的时候,又会出来一个方框,里面第一句话是 An SWT error has occurred,并且诱导你关闭eclipse,严重影响了我们对eclipse的使用。...
错误NameError: name ‘xxx’ is not defined总结情况一:要加双引号(” “)或者(’ ‘)而没加情况二:字符缩进格式的问题情况三:`if __name__==’__main__’ :` 没有和`class类`进行对齐情况四:NameError: ...
在 Java 中的基本理念是 结构不佳的代码不能运行...我们写 Java 程序经常会出现两种问题,一种是 java.lang.Exception ,一种是 java.lang.Error,都用来表示出现了异常情况,下面就针对这两种概念进行理解。 认识 Exc
Windows Exception Handling
VS2005/VS2008软件发布问题:SignTool Error: An error occurred while attempting to sign 处理方法