Take a look at GW

【java】自定义异常类

目录结构:

contents structure [+]

一,为什么需要自定义异常类

当java中的异常类型没有能够满足我们所需的异常的时候就需要自定义异常类。

二,自定义异常的方式

a.自定义异常类继承Exception或者其子类。

b.提供一个无参的和一个有参数的构造方法。

三,实例

写一个Person类,同时定义AgeException,当年龄输入不合法时,抛出异常。

AgeException异常类:

/*
 * 自定义异常需要继承Exception或其子类
 * 同时需要提供两个构造方法,第一个是无参构造,第二个是带字符串的构造
 */
public class AgeException extends Exception {

    /*
     * 这里之所以需要序列化ID,是因为从JDK1.4开始,
     * 异常信息已经添加到该类的序列化表示形式,
     * 所以如果需要打印异常信息,
     * 也就是在捕获异常的时候需要调用 e.printStackTrace() 那么就需要声明序列化ID。
     * 如果在捕获异常后不打印错误信息,就不需要声明序列化ID。
     */
    private static final long serialVersionUID = 1L;

    public AgeException(){//无参构造
        super();
    }
    
    public AgeException(String str){//带字符串的构造
        super(str);
    }

    public AgeException(Throwable cause){//从jdk1.4开始,带异常对象的构造方法,可以存储异常产生的源信息,如果需要存储异常的源信息,推荐使用这个
        super(cause);
    }
}
AgeException

Person类

/*
 * 实现Person类的封装
 */
public class Person {

    private String name;
    private int age;
    
    public Person() {
        super();
    }
    /*
     * 抛出异常
     */
    public Person(String name, int age) throws AgeException {
        super();
        setName(name);
        /*
         * 当年龄在0到150之间是合法的
         * 当年龄不合法的时候,就new一个AgeException并且抛出
         */
        if(age>0 && age<150){
            setAge(age);
        }else{
            //抛出异常类AgeException
            throw new AgeException("年龄不合法");
        }
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
Person

测试类

public class TestPerson {

    public static void main(String[] args) {
        /*
         * 创建一个Person对象
         */
        Person person=null;
        try {
            //创建Person对象的时候传入不合法的年龄
            person=new Person("jame",-1);
        } catch (AgeException e) {
            //打印异常信息
            e.printStackTrace();
        }finally{
            //打印对象
            System.out.println(person);    
        }
    }
}
TestPerson

 四,异常日志

下面的封装类可以收集java中抛出的异常信息

package cn.jd.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 用来收集异常日志
 *
 *    JavaEE  web阶段
 *
 *    当产生异常时, 应把异常收集起来 ,
 *
 *        存储到
 *            本地文件
 *            网络存储
 *            短信发送
 *            邮件
 */
public class ExceptionUtil {

    /**
     * 
     * 存储: 
     *     在存储的目录下 ,按照每天的日期创建单独文件夹
     * 
     *                 每天的文件夹中, 异常日志存储的文件, 一个异常一个文件, 文件名称按照时-分-秒-毫秒的格式存储
     *         
     * 
     * @param e 要存储的异常信息
     * @param exceptionPath 要存储的位置: 是一个文件夹, 文件夹可以不存在
     * @throws Exception 
     */
    public static void toException(Exception e,File exceptionPath) throws Exception{
        if(!exceptionPath.exists()){
            //创建文件夹
            exceptionPath.mkdirs();
        }
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String day = sdf.format(date);
        //创建每天的异常文件夹
        File dayDir = new File(exceptionPath, day);
        if(!dayDir.exists())
            dayDir.mkdirs();
        //创建本次异常存储的文件
        SimpleDateFormat sdf2 = new SimpleDateFormat("HH-mm-ss-sss");
        
        String fileName = sdf2.format(date);
        File file = new File(dayDir, fileName+".txt");
        //创建一个字符打印流 , 指向创建的这个文件
        PrintWriter pw = new PrintWriter(new FileOutputStream(file));
        //将异常信息输出至这个文件
        e.printStackTrace(pw);
        pw.close();
    }
    /**
     * 
     * @param e 要存储的异常信息 , 存储的位置 ,在F://log文件夹中
     */
    public static void toException(Exception e){
        try {
            toException(e,new File("F://log"));
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    
    
}
ExceptionUtil.java

 

posted @ 2017-05-09 15:17  HDWK  阅读(1126)  评论(0编辑  收藏  举报