JavaEE项目中的异常处理
来源:优易学  2011-12-21 18:20:57   【优易学:中国教育考试门户网】   资料下载   IT书店

  我们在定义一个新的异常类时,必须提供这样一个可以包含嵌套异常的构造函数。并有一个私有成员来保存这个“起因异常”。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异常类源码如下。我们在这里暂且把它叫做NestedExceptionjava 代码

  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方法中,我们还把整个异常信息都记录了。

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

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

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

 

[1] [2] [3] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训