`
angelhanyl
  • 浏览: 2110 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
阅读更多
    在java语言中,Exception是所有异常的父类。任何异常都扩展于Exception类。Exception就相当于一个错误类型。如果要定义一个新的错误类型就扩展一个新的Exception子类。采用异常的好处还在于可以精确的定位到导致程序出错的源代码位置,并获得详细的错误信息。

    Java异常处理通过五个关键字来实现,try,catch,throw ,throws, finally。具体的异常处理结构由try….catch….finally块来实现。try块存放可能出现异常的java语句,catch用来捕获发生的异常,并对异常进行处理。Finally块用来清除程序中未释放的资源。不管理try块的代码如何返回,finally块都总是被执行。

一个典型的异常处理代码

java 代码
  
public String getPassword(String userId)throws DataAccessException{   
String sql = “select password from userinfo where userid=’”+userId +”’”;   
String password = null;   
Connection con = null;   
Statement s = null;   
ResultSet rs = null;   
try{   
con = getConnection();//获得数据连接   
s = con.createStatement();   
rs = s.executeQuery(sql);   
while(rs.next()){   
    password = rs.getString(1);   
}   
rs.close();   
s.close();   
     
}   
Catch(SqlException ex){   
throw new DataAccessException(ex);   
}   
finally{   
try{   
      if(con != null){   
        con.close();   
      }   
}   
   Catch(SQLException sqlEx){   
     throw new DataAccessException(“关闭连接失败!”,sqlEx);   
   }   
}   
return password;   
}   
   

可以看出Java的异常处理机制具有的优势:

    给错误进行了统一的分类,通过扩展Exception类或其子类来实现。从而避免了相同的错误可能在不同的方法中具有不同的错误信息。在不同的方法中出现相同的错误时,只需要throw 相同的异常对象即可。

获得更为详细的错误信息。通过异常类,可以给出更为详细,对用户更为有用的错误信息。以便于用户进行跟踪和调试程序。

把正确的返回结果与错误信息分离。降低了程序的复杂度。调用者无需要对返回结果进行更多的了解。

强制调用者进行异常处理,提高程序的质量。当一个方法声明需要抛出一个异常时,那么调用者必须使用try….catch块对异常进行处理。当然调用者也可以让异常继续往上一层抛出。

2.Checked 异常 还是 unChecked 异常?

    Java异常分为两大类:checked 异常和unChecked 异常。所有继承java.lang.Exception 的异常都属于checked异常。所有继承java.lang.RuntimeException的异常都属于unChecked异常。

当一个方法去调用一个可能抛出checked异常的方法,必须通过try…catch块对异常进行捕获进行处理或者重新抛出。

我们看看Connection接口的createStatement()方法的声明。

public Statement createStatement() throws SQLException;

SQLException是checked异常。当调用createStatement方法时,java强制调用者必须对SQLException进行捕获处理。




java 代码
       public String getPassword(String userId){   
       try{   
       ……   
              Statement s = con.createStatement();   
              ……   
       Catch(SQLException sqlEx){   
              ……   
   }   
……   
}   
或者
java 代码
public String getPassword(String userId)throws SQLException{   
   Statement s = con.createStatement();   
}  
(当然,像Connection,Satement这些资源是需要及时关闭的,这里仅是为了说明checked 异常必须强制调用者进行捕获或继续抛出)

    unChecked异常也称为运行时异常,通常RuntimeException都表示用户无法恢复的异常,如无法获得数据库连接,不能打开文件等。虽然用户也可以像处理checked异常一样捕获unChecked异常。但是如果调用者并没有去捕获unChecked异常时,编译器并不会强制你那么做。

比如一个把字符转换为整型数值的代码如下:

java 代码
String str = “123”;   
int value = Integer.parseInt(str);  

parseInt的方法签名为:
java 代码
public static int parseInt(String s) throws NumberFormatException  
    因为java不强制调用者对unChecked异常进行捕获或往上抛出。所以程序员总是喜欢抛出unChecked异常。或者当需要一个新的异常类时,总是习惯的从RuntimeException扩展。当你去调用那些抛出它的方法时,如果没有相应的catch块,编译器也总是让你通过,同时你也根本无需要去了解这个方法倒底会抛出什么异常。看起来这似乎倒是一个很好的办法,但是这样做却是远离了java异常处理的真实意图。并且对调用你这个类的程序员带来误导,因为调用者根本不知道需要在什么情况下处理异常。而checked异常可以明确的告诉调用者,调用这个类需要处理什么异常。如果调用者不去处理,编译器都会提示并且是无法编译通过的。当然怎么处理是由调用者自己去决定的。

    所以Java推荐人们在应用代码中应该使用checked异常。就像我们在上节提到运用异常的好外在于可以强制调用者必须对将会产生的异常进行处理。包括在《java Tutorial》等java官方文档中都把checked异常作为标准用法。

    使用checked异常,应意味着有许多的try…catch在你的代码中。当在编写和处理越来越多的try…catch块之后,许多人终于开始怀疑checked异常倒底是否应该作为标准用法了。

    甚至连大名鼎鼎的《thinking in java》的作者Bruce Eckel也改变了他曾经的想法。Bruce Eckel甚至主张把unChecked异常作为标准用法。并发表文章,以试验checked异常是否应该从java中去掉。Bruce Eckel语:“当少量代码时,checked异常无疑是十分优雅的构思,并有助于避免了许多潜在的错误。但是经验表明,对大量代码来说结果正好相反”

关于checked异常和unChecked异常的详细讨论可以参考

Alan Griffiths?http://www.octopull.demon.co.uk/java/ExceptionalJava.html

Bruce Eckel?http://www.mindView.net/Etc/Disscussions/CheckedExceptions

《java Tutorial》 http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html

使用checked异常会带来许多的问题。

checked异常导致了太多的try…catch 代码

    可能有很多checked异常对开发人员来说是无法合理地进行处理的,比如SQLException。而开发人员却不得不去进行try…catch。当开发人员对一个checked异常无法正确的处理时,通常是简单的把异常打印出来或者是干脆什么也不干。特别是对于新手来说,过多的checked异常让他感到无所适从。

java 代码
       try{   
       ……   
              Statement s = con.createStatement();   
              ……   
       Catch(SQLException sqlEx){   
              sqlEx.PrintStackTrace();   
   }   
   或者   
       try{   
       ……   
              Statement s = con.createStatement();   
              ……   
       Catch(SQLException sqlEx){   
          //什么也不干   
}   
checked异常导致了许多难以理解的代码产生。

    当开发人员必须去捕获一个自己无法正确处理的checked异常,通常的是重新封装成一个新的异常后再抛出。这样做并没有为程序带来任何好处。反而使代码更难以理解。

就像我们使用JDBC代码那样,需要处理非常多的try…catch.,真正有用的代码被包含在try…catch之内。使得理解这个方法变理困难起来。

checked异常导致异常被不断的封装成另一个类异常后再抛出

java 代码
        public void methodA()throws ExceptionA{   
         …..          
          throw new ExceptionA();        
}   
          
public void methodB()throws ExceptionB{   
   try{   
      methodA();   
      ……   
   }catch(ExceptionA ex){   
   throw new ExceptionB(ex);   
   }   
}   
           
        Public void methodC()throws ExceptinC{   
       try{   
         methodB();   
         …   
       }   
       catch(ExceptionB ex){   
          throw new ExceptionC(ex);   
        }   
    }   
我们看到异常就这样一层层无休止的被封装和重新抛出。
checked异常导致破坏接口方法

   一个接口上的一个方法已被多个类使用,当为这个方法额外添加一个checked异常时,那么所有调用此方法的代码都需要修改。

   可见上面这些问题都是因为调用者无法正确的处理checked异常时而被迫去捕获和处理,被迫封装后再重新抛出。这样十分不方便,并不能带来任何好处。在这种情况下通常使用unChecked异常。

  chekced异常并不是无一是处,checked异常比传统编程的错误返回值要好用得多。通过编译器来确保正确的处理异常比通过返回值判断要好得多。

如果一个异常是致命的,不可恢复的。或者调用者去捕获它没有任何益处,使用unChecked异常。

如果一个异常是可以恢复的,可以被调用者正确处理的,使用checked异常。

    在使用unChecked异常时,必须在在方法声明中详细的说明该方法可能会抛出的unChekced异常。由调用者自己去决定是否捕获unChecked异常

到底什么时候使用checked异常,什么时候使用unChecked异常?并没有一个绝对的标准。但是笔者可以给出一些建议

    1)、当所有调用者必须处理这个异常,可以让调用者进行重试操作;或者该异常相当于该方法的第二个返回值。使用checked异常。

    2)、这个异常仅是少数比较高级的调用者才能处理,一般的调用者不能正确的处理。使用unchecked异常。有能力处理的调用者可以进行高级处理,一般调用者干脆就不处理。

    3)、这个异常是一个非常严重的错误,如数据库连接错误,文件无法打开等。或者这些异常是与外部环境相关的。不是重试可以解决的。使用unchecked异常。因为这种异常一旦出现,调用者根本无法处理。

    4)、如果不能确定时,使用unchecked异常。并详细描述可能会抛出的异常,以让调用者决定是否进行处理。

3.设计一个新的异常类

   在设计一个新的异常类时,首先看看是否真正的需要这个异常类。一般情况下尽量不要去设计新的异常类,而是尽量使用java中已经存在的异常类。

如java 代码IllegalArgumentException, UnsupportedOperationException
                       
不管是新的异常是chekced异常还是unChecked异常。我们都必须考虑异常的嵌套问题。
java 代码
public void methodA()throws ExceptionA{   
         …..          
          throw new ExceptionA();        
}   
方法methodA声明会抛出ExceptionA.

public void methodB() throws ExceptionB

   methodB声明会抛出ExceptionB,当在methodB方法中调用methodA时,如何将ExceptionA继续往上抛出。
一个办法是把methodB声明会抛出ExceptionA, 但这样已经改变了MethodB的方法签名。一旦改变,则所有调用methodB的方法都要进行改变。

另一个办法是把ExceptionA封装成ExceptionB,然后再抛出。如果我们不把ExceptionA封装在ExceptionB中,就丢失了根异常信息,使得无法跟踪异常的原始出处。

java 代码
public void methodB()throws ExceptionB{   
   try{   
      methodA();   
      ……   
   }catch(ExceptionA ex){   
     throw new ExceptionB(ex);   
   }   
}  

   如上面的代码中,ExceptionB嵌套一个ExceptionA.我们暂且把ExceptionA称为“起因异常”,因为ExceptionA导致了ExceptionB的产生。这样才不使异常信息丢失。



所以我们在定义一个新的异常类时,必须提供这样一个可以包含嵌套异常的构造函数。并有一个私有成员来保存这个“起因异常”。
java 代码
public Class ExceptionB extends Exception{   
private Throwable cause;   
    
public ExceptionB(String msg, Throwable ex){   
super(msg);   
this.cause = ex;   
}   
    
public ExceptionB(String msg){   
super(msg);   
}   
    
public ExceptionB(Throwable ex){   
this.cause = ex;   
}   
}   
当然,我们在调用printStackTrace方法时,需要把所有的“起因异常”的信息也同时打印出来。所以我们需要覆写printStackTrace方法来显示全部的异常栈跟踪。包括嵌套异常的栈跟踪。
java 代码
public void printStackTrace(PrintStrean ps){   
if(cause == null){   
super.printStackTrace(ps);   
}else{   
ps.println(this);   
cause.printStackTrace(ps);   
}   
}   
一个完整的支持嵌套的checked异常类源码如下。我们在这里暂且把它叫做NestedException

java 代码
public NestedException extends Exception{   
private Throwable cause;   
public NestedException (String msg){   
super(msg);   
}   
    
public NestedException(String msg, Throwable ex){   
super(msg);   
This.cause = ex;   
}   
    
public Throwable getCause(){   
return (this.cause == null ? this :this.cause);   
}   
    
public getMessage(){   
String message = super.getMessage();   
Throwable cause = getCause();   
   if(cause != null){   
     message = message + “;nested Exception is ” + cause;   
   }   
return message;   
}   
public void printStackTrace(PrintStream ps){   
if(getCause == null){   
    super.printStackTrace(ps);   
       
}else{   
ps.println(this);   
getCause().printStackTrace(ps);   
}   
}   
    
public void printStackTrace(PrintWrite pw){   
if(getCause() == null){   
    super.printStackTrace(pw);   
}   
else{   
    pw.println(this);   
    getCause().printStackTrace(pw);   
}   
}   
public void printStackTrace(){   
printStackTrace(System.error);   
}   
}   
    
同样要设计一个unChecked异常类也与上面一样。只是需要继承RuntimeException。


4.  如何记录异常
    作为一个大型的应用系统都需要用日志文件来记录系统的运行,以便于跟踪和记录系统的运行情况。系统发生的异常理所当然的需要记录在日志系统中。
java 代码
public String getPassword(String userId)throws NoSuchUserException{   
UserInfo user = userDao.queryUserById(userId);   
If(user == null){   
Logger.info(“找不到该用户信息,userId=”+userId);   
throw new NoSuchUserException(“找不到该用户信息,userId=”+userId);   
}   
else{   
return user.getPassword();   
}   
}   
    
public void sendUserPassword(String userId) throws Exception {   
UserInfo user = null;   
try{   
  user = getPassword(userId);   
   //……..   
sendMail();   
//   
}catch(NoSuchUserException ex)(   
   logger.error(“找不到该用户信息:”+userId+ex);   
   throw new Exception(ex);   
}   
我们注意到,一个错误被记录了两次.在错误的起源位置我们仅是以info级别进行记录。而在sendUserPassword方法中,我们还把整个异常信息都记录了。

笔者曾看到很多项目是这样记录异常的,不管三七二一,只有遇到异常就把整个异常全部记录下。如果一个异常被不断的封装抛出多次,那么就被记录了多次。那么异常倒底该在什么地方被记录?

异常应该在最初产生的位置记录!

如果必须捕获一个无法正确处理的异常,仅仅是把它封装成另外一种异常往上抛出。不必再次把已经被记录过的异常再次记录。

如果捕获到一个异常,但是这个异常是可以处理的。则无需要记录异常


java 代码
public Date getDate(String str){   
Date applyDate = null;   
SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);   
try{   
applyDate = format.parse(applyDateStr);   
}   
catch(ParseException ex){   
//乎略,当格式错误时,返回null   
}   
return applyDate;   
}   
捕获到一个未记录过的异常或外部系统异常时,应该记录异常的详细信息
java 代码
try{   
       ……   
        String sql=”select * from userinfo”;   
              Statement s = con.createStatement();   
              ……   
       Catch(SQLException sqlEx){   
          Logger.error(“sql执行错误”+sql+sqlEx);   
}   
   究竟在哪里记录异常信息,及怎么记录异常信息,可能是见仁见智的问题了。甚至有些系统让异常类一记录异常。当产生一个新异常对象时,异常信息就被自动记录。
java 代码
  public class BusinessException extends Exception {   
      private void logTrace() {   
          StringBuffer buffer=new StringBuffer();   
          buffer.append("Business Error in Class: ");   
          buffer.append(getClassName());   
          buffer.append(",method: ");   
          buffer.append(getMethodName());   
          buffer.append(",messsage: ");   
          buffer.append(this.getMessage());   
          logger.error(buffer.toString());   
             
}   
public BusinessException(String s) {   
         super(s);   
Trace();   
}   
    这似乎看起来是十分美妙的,其实必然导致了异常被重复记录。同时违反了“类的职责分配原则”,是一种不好的设计。记录异常不属于异常类的行为,记录异常应该由专门的日志系统去做。并且异常的记录信息是不断变化的。我们在记录异常时应该给出更丰富些的信息。以利于我们能够根据异常信息找到问题的根源,以解决问题。

   虽然我们对记录异常讨论了很多,过多的强调这些反而使开发人员更为疑惑,一种好的方式是为系统提供一个异常处理框架。由框架来决定是否记录异常和怎么记录异常。而不是由普通程序员去决定。但是了解些还是有益的。

5.J2EE项目中的异常处理

    目前,J2ee项目一般都会从逻辑上分为多层。比较经典的分为三层:表示层,业务层,集成层(包括数据库访问和外部系统的访问)。

J2ee项目有着其复杂性,J2ee项目的异常处理需要特别注意几个问题。

    在分布式应用时,我们会遇到许多checked异常。所有RMI调用(包括EJB远程接口调用)都会抛出java.rmi.RemoteException;同时RemoteException是checked异常,当我们在业务系统中进行远程调用时,我们都需要编写大量的代码来处理这些checked异常。而一旦发生RemoteException这些checked异常对系统是非常严重的,几乎没有任何进行重试的可能。也就是说,当出现RemoteException这些可怕的checked异常,我们没有任何重试的必要性,却必须要编写大量的try…catch代码去处理它。一般我们都是在最底层进行RMI调用,只要有一个RMI调用,所有上层的接口都会要求抛出RemoteException异常。因为我们处理RemoteException的方式就是把它继续往上抛。这样一来就破坏了我们业务接口。RemoteException这些J2EE系统级的异常严重的影响了我们的业务接口。我们对系统进行分层的目的就是减少系统之间的依赖,每一层的技术改变不至于影响到其它层。


java 代码
//   
public class UserSoaImpl implements UserSoa{   
   public UserInfo getUserInfo(String userId)throws RemoteException{   
      //……   
远程方法调用.   
      //……   
   }   
}   
public interface UserManager{   
   public UserInfo getUserInfo(Stirng userId)throws RemoteException;   
}   
同样JDBC访问都会抛出SQLException的checked异常。

   为了避免系统级的checked异常对业务系统的深度侵入,我们可以为业务方法定义一个业务系统自己的异常。针对像SQLException,RemoteException这些非常严重的异常,我们可以新定义一个unChecked的异常,然后把SQLException,RemoteException封装成unChecked异常后抛出。

如果这个系统级的异常是要交由上一级调用者处理的,可以新定义一个checked的业务异常,然后把系统级的异常封存装成业务级的异常后再抛出。

一般地,我们需要定义一个unChecked异常,让集成层接口的所有方法都声明抛出这unChecked异常。

java 代码
public DataAccessException extends RuntimeException{   
……   
}   
public interface UserDao{   
public String getPassword(String userId)throws DataAccessException;   
}   
    
public class UserDaoImpl implements UserDAO{   
public String getPassword(String userId)throws DataAccessException{   
String sql = “select password from userInfo where userId= ‘”+userId+”’”;   
try{   
    …   
     //JDBC调用   
     s.executeQuery(sql);   
    …   
   }catch(SQLException ex){   
      throw new DataAccessException(“数据库查询失败”+sql,ex);   
   }   
}   
}   
定义一个checked的业务异常,让业务层的接口的所有方法都声明抛出Checked异常.

java 代码
public class BusinessException extends Exception{   
…..   
}   
    
public interface UserManager{   
   public Userinfo copyUserInfo(Userinfo user)throws BusinessException{   
      Userinfo newUser = null;   
      try{   
        newUser = (Userinfo)user.clone();   
}catch(CloneNotSupportedException ex){   
throw new BusinessException(“不支持clone方法:”+Userinfo.class.getName(),ex);   
}   
}   
}  
J2ee表示层应该是一个很薄的层,主要的功能为:获得页面请求,把页面的参数组装成POJO对象,调用相应的业务方法,然后进行页面转发,把相应的业务数据呈现给页面。表示层需要注意一个问题,表示层需要对数据的合法性进行校验,比如某些录入域不能为空,字符长度校验等。

J2ee从页面所有传给后台的参数都是字符型的,如果要求输入数值或日期类型的参数时,必须把字符值转换为相应的数值或日期值。

如果表示层代码校验参数不合法时,应该返回到原始页面,让用户重新录入数据,并提示相关的错误信息。

通常把一个从页面传来的参数转换为数值,我们可以看到这样的代码

java 代码
ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{   
   String ageStr = request.getParameter(“age”);   
   int age = Integer.parse(ageStr);   
   …………   
    
String birthDayStr = request.getParameter(“birthDay”);   
SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);   
Date birthDay = format.parse(birthDayStr);   
    
}   
上面的代码应该经常见到,但是当用户从页面录入一个不能转换为整型的字符或一个错误的日期值时,

Integer.parse()方法被抛出一个NumberFormatException的unChecked异常。但是这个异常绝对不是一个致命的异常,一般当用户在页面的录入域录入的值不合法时,我们应该提示用户进行重新录入。但是一旦抛出unchecked异常,就没有重试的机会了。像这样的代码造成大量的异常信息显示到页面。使我们的系统看起来非常的脆弱。

同样,SimpleDateFormat.parse()方法也会抛出ParseException的unChecked异常。

这种情况我们都应该捕获这些unChecked异常,并给提示用户重新录入。


java 代码
ModeAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{   
   String ageStr = request.getParameter(“age”);   
String birthDayStr = request.getParameter(“birthDay”);   
   int age = 0;   
Date birthDay = null;   
try{   
age=Integer.parse(ageStr);   
   }catch(NumberFormatException ex){   
     error.reject(“age”,”不是合法的整数值”);   
   }   
   …………   
    
try{   
SimpleDateFormat format = new SimpleDateFormat(“MM/dd/yyyy”);   
birthDay = format.parse(birthDayStr);   
}catch(ParseException ex){   
error.reject(“birthDay”,”不是合法的日期,请录入’MM/dd/yyy’格式的日期”);   
}   
    
}  


分享到:
评论

相关推荐

    UncaughtException处理类

    在Java编程语言中,`UncaughtException`处理是程序中不可或缺的一部分,因为它涉及到程序的健壮性和稳定性。当一个线程非正常终止,也就是说抛出了一个未捕获的异常,而这个异常没有被该线程或者其父线程的任何...

    java_android_UncaughtException处理类,当程序发生异常的时候,由该类接管程序,并记录报告

    UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告. 获取CrashHandler实例 ,单例模式 崩溃处理 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成. 收集设备参数...

    spingMVC Exception处理类

    springMVC 异常处理类的三种写法。代码已经写出,大家可以下载借鉴,并加以修改。

    Android Native Exception

    通过上述案例,我们可以看到Native Exception处理流程的具体实现细节,这对于深入理解和解决实际问题具有重要意义。 #### 五、结论 本文详细介绍了Android Native Exception的相关概念、处理流程及其实现细节,...

    OK:Elixir中优雅的errorexception处理,结果为monads

    Elixir中的"OK"模式是一种优雅地处理错误的方式,它结合了Exception处理和Monad的概念,提供了更一致且可读性强的代码结构。这种模式通常与pipeline(管道)和宏(macros)一起使用,以实现Elixir应用程序中的错误...

    Retrofit2+Rxjava2网络请求异常统一封装处理

    本篇文章将详细讲解如何使用Retrofit2和RxJava2进行网络请求,并进行异常统一封装处理,以便提供更好的用户体验和更高效的调试。 Retrofit2是一个由Square公司开发的类型安全的HTTP客户端,它允许我们通过简单的...

    exception 异常处理 exception

    - **使用合适类型的异常**:对于可预见的情况使用 `RuntimeException`,对于不可预见但需要处理的情况使用 `Exception`。 - **记录异常**:在生产环境中,捕获到异常后应记录日志,便于后期分析问题。 通过上述分析...

    C++Exception 异常处理 源码

    在C++编程中,异常处理是一项关键的错误处理机制,它允许程序员在程序运行时捕获和处理意外的情况。异常处理通常涉及三个关键字:`try`、`catch`和`throw`,它们协同工作以确保程序在遇到问题时能够优雅地恢复或提供...

    Oracle_存储过程exception异常处理大全及实例经典最终.docx

    ### Oracle 存储过程 Exception 异常处理详解 #### 1. 异常处理概念 在 Oracle 存储过程中,异常处理是一项非常重要的技术,它能够帮助开发人员处理那些不可预见的情况,确保程序的健壮性和稳定性。异常处理主要...

    c++异常处理exception.rar

    异常类通常是继承自`std::exception`的类,提供了基本的错误信息和处理方式。 2. `try`块: `try`块是用来包含可能抛出异常的代码的。如果在`try`块内的代码抛出了异常,程序会立即停止执行`try`块内的剩余代码,...

    第十八章异常(Exception)处理

    异常(Exception)是Java中一种特殊的运行错误对象,它代表了程序执行期间发生的非正常情况,需要进行处理以避免程序中断。 18.1 异常类结构与组成 Java中的异常都源自`java.lang.Throwable`类。Throwable有两个...

    异常处理流程图Exception

    本文将深入探讨异常处理流程,通过分析给定的“异常处理流程图Exception”来理解其核心概念。 ### 异常处理概述 异常处理是一种编程模式,用于捕捉和响应程序运行时可能发生的非正常事件,这些事件被称为异常。在...

    exception C++ & More exception C++

    在C++编程语言中,异常处理(Exception Handling)是一个至关重要的概念,它允许程序员优雅地处理程序运行时发生的错误情况,而不是让程序崩溃。"Exception C++ & More Exception C++"可能是指两本关于深入理解和...

    java Exception

    - **Exception**:代表可以被程序捕获和处理的异常。`Exception`进一步分为两大类:`RuntimeException`(未检查异常)和非`RuntimeException`(已检查异常)。 ##### 2. 异常分类 - **RuntimeException**:这类...

    Exception Application for MFC

    Root Exception-Block是整个程序的顶级异常处理区块,它可以捕获所有未被捕获的异常,确保程序在遇到异常时不会突然崩溃。 【eAppRAISE的参数:Exception-ID】 eAppRAISE宏用于抛出异常,其参数Exception-ID是一个...

    error与Exception的区别

    在编程世界中,错误处理是不可或缺的一部分,Java和许多其他编程语言中,"error"和"exception"这两个术语经常被提及。理解它们之间的区别对于编写健壮和可靠的代码至关重要。 首先,我们来看"error"。在Java中,`...

    Checked and Unchecked Exception

    在这个例子中,如果 `b` 为零,会抛出 `ArithmeticException`,这是一个未检查异常,编译器不会强制要求处理它,但如果不处理,程序会在运行时崩溃。 **源码与工具** 了解异常处理机制的源码可以帮助开发者深入理解...

    JAVA 自定义异常 Exception

    通常,我们选择继承`Exception`类,因为它用于表示程序可以恢复的错误,而`Error`则用于表示系统级的严重问题,一般程序员无法处理。 创建自定义异常的步骤如下: 1. **定义新异常类**:创建一个新的Java类,并让...

    C#代码开发规范.doc

    这些规则涵盖了命名规范、缩进和注释、Exception处理等方面。 命名规范是C#代码开发规范的重要组成部分。命名规范中规定了类名、方法名、变量名、接口名等命名规则。例如,类名和方法名使用Pascal标志法,变量名和...

Global site tag (gtag.js) - Google Analytics