• error和exception的区别


    ------解决方法--------------------------------------------------------
    了解异常与错误的区别,并且知道当你截获一个异常时,应该怎么办。
      by Josh Street
      许多程序员并没有意识到一个错误和一个异常是有区别的,在出现问题时,这种区别对如何操作你的代码有很重要的含意(见工具条,“简介错误与异常”)。正如Mary Campione在The Java Tutorial(Java指南)中所写的,“一个异常是在一个程序执行过程中出现的一个事件,它中断了正常指令的运行。”根据American Heritage Dictionary的解释,一个错误是“偏离了可接受的代码行为的一个动作或一个实例。”
     
      那么偏离(deviation)和中断(disruption)有什么不同呢?我们可以这么来解释:如果你正在一条路上驾驶,有人截住了你,这就是中断。如果车发动不了了,那就是偏离(除非是我的车,我们认为这种情况是normal的)。
     
      这同Java有什么关系呢?有很大的关系。Java有个很有趣的错误和异常层次关系(见图1)。
     
      的确,运用try {} catch (Exception e) {}的所有代码只能找到一半你的错误。但是你是否应该截获Throwable取决于你一旦截获了它,你准备怎么处理它。对Error的子集的快速了解可以让你知道许多类的名字,如VirtualMachineError、ThreadDeath和LinkageError。在你打算截获这些错误时,确信你要处理它们,因为它们是严重的问题,所以是错误。
     
     
      图1. Java中错误和异常的层次关系
      但ClassCastException不是一个错误吗?的确不是。一个ClassCastException——或一种异常——只是VM(虚拟机)通知你的一种方式,通过这种方式,VM让你知道,你(开发人员)已经犯了个错误,现在有一个机会来修改它。
     
      另一方面,错误是VM的一个故障(虽然它可以是任何系统级的服务)。我们来引用JavaDoc对Error的定义:“Error是Throwable的一个子集,它指的是一个合理的应用程序不能截获的严重的问题。大多数都是反常的情况。”
     
      所以,错误是很难处理的,一般的开发人员(当然不是你)是不能理解处理这些错误的微妙之处的。那么在你的工作中,当你觉得会产生一个足以被称为错误的一个事件时,该怎么办呢?
     
     
     
     
      首先,记住错误是像异常一样被抛出的,只有一点不同。抛出一个错误的方法不需要声明它在做什么(换句话说,异常是unchecked):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();
      }
     
     
     
     
      注意有几个异常是unchecked的,因此,其行为就同错误一样:NullPointerException、ClassCastException和IndexOutOfBoundsException都是RuntimeException的子类,RuntimeException及其所有的子集通常都是unchecked的。
     
      那么你应该怎么处理这些讨厌的unchecked的异常呢?你可以在它们可能出现的方法中截获异常,但这种方法有很大的偶然性。这么做可以解决一个问题,但是它会使其它unchecked的异常中断代码的其它部分。我们应该感谢ThreadGroup类提供的一个很好的办法:public class ApplicationLoader extends ThreadGroup
      {
      private ApplicationLoader()
      {
      super("ApplicationLoader");
      }
      public static void main(String[] args)
      {
      Runnable appStarter = new Runnable()
      {
      public void run()
      {

  • 相关阅读:
    第一节 Spring的环境搭建
    002. 配置环境变量
    001. 巧妇难为无米之炊之安装环境
    第七节 认识SpringMVC中的表单标签
    [六字真言]6.吽.SpringMVC中上传大小异常填坑
    [六字真言]4.叭.SpringMVC异常痛苦
    [六字真言]5.咪.功力不足,学习前端JavaScript异常
    [六字真言]3.呢.异常的谎言,你要相信多少次?
    [六字真言]2.嘛.异常定制和通用.md
    vim基本技巧
  • 原文地址:https://www.cnblogs.com/heartstage/p/3365676.html
Copyright © 2020-2023  润新知