java异常处理实践

来源:互联网 发布:官网敏特英语软件下载 编辑:程序博客网 时间:2024/05/16 15:43

最近看了android 系统代码里面有好多异常类,自己往往都是 try catch 然后打印。

虽然学校的时候对java很少了解,现在却乱的很,今天想看下具体原理:

梳理下自己的理解:

1 所有异常都是程序员可以选择的:

你可以选择 让编译器检查,也可以选择不让检查

比如:使用 runtimeexception 就可以跳过检查,也可以将 error和其他exception 进行异常转移到runtimeexception里来跳过检查。

我们可以拦截所有的异常,然后自己处理。只需 try catch 或者throws 然后进行以上两种方式转换,就可以避免程序无法继续进行的问题。如果不处理

就会向上,用java自带的处理机制来处理了。到时候是error就是error,是其他exception就是其他exception了。这两个都是会程序直接退出线程的。

2 自定义异常 :

先定义一个自定义异常类

class b extends Exception{
     public b(String msg){
            super(msg);
            System.out.println("for test ,not afraid");
        }
    
}

然后在一个地方对该异常类进行处理 如果没有处理这个异常的代码,那么这个异常将会被跑到最上层

被消耗掉。上层如果也没处理就会该怎么这就怎么这了。

class c   
 {  
     public int functions(int x,int y) throws b  
     {  
         if(y<0)  
         {  
             throw new b("您输入的不能为负数!");//抛出异常  
         }  
         if(y==0)  
         {  
             throw new b("您输入的不能为0!");  
         }  
       
         int m=x/y;  
         return m;  
     }  
 }      

这样以后再用到这个 functions方法的时候就会抛出异常。

public class ad
{
    public  ad(){
        System.out.println("父类构造方法");  
    }
    
    public static void main(String[] args)
    {
        c n=new c();  
          
        //捕获异常  
        try  
        {  
            System.out.println("result:"+n.shang(1,-3));  
        }  
        catch(b yc)  
        {  
            System.out.println(yc.getMessage());  
            yc.printStackTrace();  
        }  
       
    }
    
}

 class b extends Exception{
     public b(String msg){
            super(msg);
            System.out.println("for test ,not afraid");
        }
    
}
 class c   
 {  
     public int shang(int x,int y) throws b  
     {  
         if(y<0)  
         {  
             throw new b("您输入的不能为负数!");//抛出异常  
         }  
         if(y==0)  
         {  
             throw new b("您输入的不能为0!");  
         }  
       
         int m=x/y;  
         return m;  
     }  
 }      

3 如何设计自己的异常处理框架:

看下一个 模板:


在这个设计图中,AppRuntimeException是系统异常的基类,对外只抛出这个异常,这个异常可以由前端(客户端)接收处理,当异常发生时,客户端的相关组件捕获并处理这些异常,将"友好"的信息展示给客户。

   AppRuntimeException下层,有各种各样的异常和错误,最终都转译为AppRuntimeExceptionAppRuntimeException下面还可以设计一些别的子类异常,比如AppDAOExceptionOtherException等,这些都根据实际需要灵活处理。在往下就是如何将捕获的原始异常比如SQLExceptionHibernateException转换为更高级一点AppDAOException

   有关异常框架设计这方面公认比较好的就是SpringSpring中的所有异常都可以用org.springframework.core.NestedRuntimeException来表示,并且该基类继承的是RuntimeExceptionSpring框架很庞大,因此设计了很多NestedRuntimeException的子类,还有异常转换的工具,这些都是非常优秀的设计思想。

异常的处理存在着一套哲学思想:对于一个应用系统来说,系统所发生的任何异常或者错误对操作用户来说都是系统"运行时"异常,都是这个应用系统内部的异常。这也是异常转译和应用系统异常框架设计的指导原则。在系统中大量处理非检查异常的负面影响很多,最重要的一个方面就是代码可读性降低,程序编写复杂,异常处理的代码也很苍白无力。因此,很有必要将这些检查异常Exception和错误Error转换为RuntimeException异常,让程序员根据情况来决定是否捕获和处理所发生的异常。

摘抄了好多文章合成了这个东西。现在仍然只是一知半解,等待以后实践验证和深化


原创粉丝点击