IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]【Java编程高级进阶】如何使用自定义类型的异常?

    testcs_dn发表于 2017-01-02 13:40:38
    love 0

    在文章“Unreachable catch block for IOException. This exception is never thrown from the try statement body”中有小伙伴提到:我的是一个自定义的异常,用到自定义的异常就出现这个问题,请问怎么解决?这里讲一下如何使用自定义类型的异常,以及为什么要使用自定义类型的异常。

    异常的分类

    1. 非运行时异常(Checked Exception)
    Java中凡是继承自Exception但不是继承自RuntimeException的类都是非运行时异常。
    2. 运行时异常(Runtime Exception/Unchecked Exception)
    RuntimeException类直接继承自Exception类,称为运行时异常。Java中所有的运行时异常都直接或间接的继承自RuntimeException。
    Java中所有的异常类都直接或间接的继承自Exception。

    异常的处理

    一、对应非运行时异常,必须对其进行处理。处理方式有两种:
    使用try…catch…finally语句块进行捕获
    在产生异常的方法所在的方法声明throws Exception
    二、对于运行时异常,可以不对其进行处理,也可以对其进行处理。一般情况下都不对其进行处理。
    在使用Java API的方法时会产生异常,由于实际的需要,我们需要创建和使用自定义异常。使用全新的异常类,应用到系统程序中。

    为什么使用自定义类型的异常

    其实这是问题处理的模式/方式之一;

    其它的是什么?例如WindowsAPI的GetLastError,swift、Go的多返回值 ,返回一个实体类包含所有需要的信息;

    而这个方法同样也有多种应用。

    应用一:你的一个方法中把一些必须满足的条件作为异常来处理;

    应用二:你的一个方法中把所有可能遇到的异常都捕获了,附加上其它信息抛出新的异常;

    应用三:以上两种混合应用;

    应用实例

    自定义异常类:CustomException.java

    package wasdev.sample.servlet;
    
    /**
     * 自定义异常
     * @author testcs_dn
     * 
     */
    public class CustomException extends Exception {
    
    	private static final long serialVersionUID = -3260180827302646043L;
    	/**
    	 * 扩展信息
    	 */
    	private String exMsg;
    	public String getExMsg() {
    		return exMsg;
    	}
    
    	public void setExMsg(String exMsg) {
    		this.exMsg = exMsg;
    	}
    
    	/**
    	 * 
    	 */
    	public CustomException() {
    		super();
    	}
    
    	public CustomException(String msg) {
    		super(msg);
    	}
    
    	/**
    	 * 
    	 * @param msg 异常信息
    	 * @param exMsg 扩展信息
    	 */
    	public CustomException(String msg, String exMsg) {
    		super(msg);
    		this.setExMsg(exMsg);
    	}
    }
    
    应用类Servlet:SimpleServlet.java
    package wasdev.sample.servlet;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * Servlet implementation class SimpleServlet
     */
    @WebServlet("/SimpleServlet")
    public class SimpleServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html");
            response.getWriter().print("Hello World!");
            
            try {
    			doSomething();
    		} catch (CustomException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            
            try {
    			doSomething("user", "pwd");
    		} catch (CustomException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        }
        
        protected void doSomething() throws CustomException{
        	throw new CustomException("abcd");
        	
        }
        
        protected void doSomething(String userName, String password) throws CustomException{
        	if (userName == null || userName.length() == 0){
        		throw new CustomException("abcd", "userName");
        	}
        	
        	if (password == null || password.length() == 0){
        		throw new CustomException("abcd", "password");
        	}
        	
        	File f = new File("test.txt");
        	if (f.exists()){
        		try {
    				FileOutputStream fos = new FileOutputStream(f);
    				try {
    					fos.close();
    				} catch (IOException e) {
    					throw new CustomException("abcd", "IOException");
    				}
    			} catch (FileNotFoundException e) {
    				throw new CustomException("abcd", "FileNotFoundException");
    			}
        		
        	}
        }
    
        protected void doSomething2(){
        	try {
        		throw new CustomException("abcd", "扩展信息");
    		} catch (CustomException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
        }
    }
    

    结束语

    这里只是演示自定义异常的使用方式,不要纠结演示代码的业务合理性,

    如果你有更好的应用场景欢迎分享!

    我这里只定义了一个异常类:CustomException,你也可以做如下定义,只要你喜欢:

    UserNameException,PasswordException,FileWriteException……等等。

    ===========文档信息============ 
    版权声明:非商用自由转载-保持署名-注明出处 
    署名(BY) :testcs_dn(微wx笑) 
    文章出处:[无知人生,记录点滴](http://blog.csdn.net/testcs_dn)



沪ICP备19023445号-2号
友情链接