假設:
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,也是一種藝術地!
沒有留言:
張貼留言