javaEE异常处理

1.java采用的是统一的异常处理机制,Exception是所以异常类的基类,所有的异常类都扩展于Exception类,如果想要定义一个新的异常类型,就应扩展一个新的Exception类。异常处理采用try,catch,finall,throw,thows五个关键字,其中try,catch,finall组合成try...catch...finally结构,其中try放在可能出现异常的地方,catch用来捕获异常,finally主要用来释放程序未释放的资源。不论try内的异常出现与否,finally里面的代码都会被执行。当一个函数中要出现异常时,可以用try..catch..finally结构来处理异常,也可以向上一层继续抛出异常。
2.所有继承于java.lang.Exception的异常类属于checked异常,所有继承于java.lang.RuntimeException的异常类型属于unchecked异常。程序中出现checked异常时,必须用try..catch..finally结构来处理异常,而RuntimeException属于运行时异常,unchecked异常表示用户无法恢复的异常,所以程序中的unchecked异常无需用try..catch..finally处理或向上抛出。
3.一般情况下,我们不需要创建新的异常类,而是使用现存的异常类。但我们也会创建新的异常类,在创建异常类时,我们应考虑异常的嵌套问题。

public void methodA throws ExceptionA(){
...
throw new ExceptionA();
}
public void methodB throws ExceptionB(){
...
throw new ExceptionB();
}

注意,当在methodB中调用methodA时,必须考虑处理可能抛出的ExceptionA,有两种做法,第一种是在methodB声明中声明抛出ExceptionA,这样会改变methodB的方法签名,而且一旦methodA的抛出异常机制一旦改变,则所有的调用methodA的方法都要改变。还有另一种处理方法,就是在定义异常类的时候在异常类中添加一个私有属性来记录异常起因,并且定义相应的构造方法。

public class ExceptionB extends Exception{
private Throwable cause;
public ExceptionBThrowable cause,String message){
super(message);
this.cause=cause;
}
public ExceptionB(String message){
super(message);
}
public ExceptionB(Throwable cause){
this.cause=cause;
}

当然,如果是这样的话,那么在使用printStackTrace()方法打印异常信息时,也要将起因异常的异常信息打印出来,这时我们就必须复写printStackTrace方法。如下:

public void printStackTrace(PrintStream ps){
if(cause==null){
printStackTrace(ps);
}else{
printStackTrace(ps);
printStackTrace(cause);
}
}

完整的异常类声明代码如下:

public NestedException extends Exception{
private Throwable cause;
public NestedException(Throwable cause,String message){
this.cause=cause;
super(message);
}
public NestedException(String message){
super(message);
}
public Throwable getCause(){
return (cause==null)?this:this.cause;
}
public String getMessage(){
String message=super.getMessage();
Throwable cause=this.getCause();
if(cause!=null){
message=message+",Nested message is"+cause;
}
return message;
}
public void printStackTrace(PrintStream ps){
if(ps==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异常与上面一样,但要将extends Exception改为extends RuntimeException。
4.系统出现的异常可以记录在日志系统中。

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);
}

如果捕获到一个异常,但是这个异常是可以处理的。则无需要记录异常。捕获到一个未记录过的异常或外部系统异常时,应该记录异常的详细信息

try{
...
String sql="select * from user";
Statement stmt=conn.createStatement();
...
}catch(SQLException e){
Logger.error("sql执行错误"+sql+e);
}

5.javaee一般分为3层:表现层,业务层,集成层。
在分布式应用中,一般会遇到很多checked异常,而checked异常对系统是非常严重的,几乎没用重试的可能,因此必须写大量的try...catch代码来处理它们。为避免checked异常对系统造成很大的侵入性,我们可以针对SQLException等checked异常,定义新的unchecked异常将checked异常的异常信息封装起来再抛出。例如:

public DataAccessException extends RuntimeException{
....
}
public interface UserDao{
public String getPassword(String userId)throws DataAccessException;
}
public UserDaoImp implements UserDao{
public String getPassword(String userId)throws DataAccessException{
...
String sql=...;
try{
...
s.executeQuery(sql);
...
}catch(SQLException e){
throw new DataAccessException("访问数据库异常:"+sql,e);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值