Amazon Ads

2013年8月1日 星期四

[分享]Java包Exception

假設:
package idv.jk.exception;

public class ExceptionWrapper {
    public static void main(String[] args){
        try {
            new ExceptionWrapper().div(1, 0);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
   
    public int div(int a, int b) throws Exception{
        return a/b;
    }
}
當這段程式執行後,因為1/0的關係,一定會造成Exception
java.lang.ArithmeticException: / by zero
     at idv.jk.exception.ExceptionWrapper.div(ExceptionWrapper.java:14)
     at idv.jk.exception.ExceptionWrapper.main(ExceptionWrapper.java:6)

若循著error stack去找,通常可以很快找到是那行程式出錯。

但這時你又會想,靠!使用者是傳了那個白癡參數進來!
一定會想在第一時間拿起電話,打給使用你API的人說,你不可以這樣用(一邊心裡os:傻蛋),但這年代是講證據的,你總要有一份證據,才能說一段話。但通常你的語氣是:「不好意思,造成了你的困擾,可以請問一下你傳的參數是?」

所以在這樣的需求下,你應該介入去控制你的Exception若被丟出來時,你要讓你的Exception盡量去提供你要知道的事,讓他可以幫助你在第一時間去解決你的問題。

上面的除法method我就會改成:

    public int div(int a, int b) throws Exception{
        try {
            return a/b;
        } catch (Exception e) {
            throw new Exception("a: " + a + ", b:" + b, e);
        }
    }

加入一些客製化的內容在Exception中,再次執行程式後,
java.lang.Exception: a: 1, b:0
     at idv.jk.exception.ExceptionWrapper.div(ExceptionWrapper.java:16)
     at idv.jk.exception.ExceptionWrapper.main(ExceptionWrapper.java:6)
Caused by: java.lang.ArithmeticException: / by zero
     at idv.jk.exception.ExceptionWrapper.div(ExceptionWrapper.java:14)
     ... 1 more

那個e的參數,就還是一個會顯示在Cause這一段訊息裡,但最上面那一行可以看到使用者傳入的參數。

所以你可以第一時間拿起電話,打給那個使用的豬頭,說:「那個參數不能傳0啦!(傻呆)」,不過若對方資歷比你老,應該會回你一句:「你不會做防呆啊!」

咦!若在new Exception中沒有傳入e這個參數會變成如何呢?程式都貼在上面了,自己試試吧!

所以,如何丟出一個Exception,也是一種藝術地!

沒有留言: