Java Exception 捕獲和顯示實例詳解
Java Exception 捕獲和顯示實例詳解
在進(jìn)行Java B/S架構(gòu)開發(fā)時,經(jīng)常有這樣的場景:后端處理業(yè)務(wù)邏輯,前端負(fù)責(zé)展示,當(dāng)后端處理出現(xiàn)異常時,如何把錯誤信息展示給前臺呢?錯誤信息棧通常很多,對開發(fā)人員查找問題比較方便,但對于客戶來說,打一堆的錯誤信息,無疑是對他們感官的一種摧殘,如何捕捉最重要的信息顯示到客戶端呢?該信息要求簡明扼要,指向出錯點,且應(yīng)指明異常的類型。
在很多情況下Exception的 getMessage()方法返回空的值,如果使用該方式則會在前端顯示空值。我們要顯示的重要信息有兩個:
- 異常類型
- 出錯點和出錯信息
1、異常類型如何獲得呢?
可以通過Exception 的getClass().getName()方法來實現(xiàn)。
2、出錯點如何獲得呢?
出錯點信息一般在“Cause by:”標(biāo)識開始的行。如果能抓取到該行,則可取出異常信息,一個異常棧例子如下:
Caused by: org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF> at org.apache.activemq.selector.SelectorParser.generateParseException(SelectorParser.java:1231) at org.apache.activemq.selector.SelectorParser.jj_consume_token(SelectorParser.java:1179) at org.apache.activemq.selector.SelectorParser.unaryExpr(SelectorParser.java:468) at org.apache.activemq.selector.SelectorParser.multExpr(SelectorParser.java:390) at org.apache.activemq.selector.SelectorParser.addExpression(SelectorParser.java:359) at org.apache.activemq.selector.SelectorParser.comparisonExpression(SelectorParser.java:211) at org.apache.activemq.selector.SelectorParser.equalityExpression(SelectorParser.java:156) at org.apache.activemq.selector.SelectorParser.andExpression(SelectorParser.java:135) at org.apache.activemq.selector.SelectorParser.orExpression(SelectorParser.java:114) at org.apache.activemq.selector.SelectorParser.JmsSelector(SelectorParser.java:106) at org.apache.activemq.selector.SelectorParser.parse(SelectorParser.java:84) ... 63 more
由于一些原因,往往它并不出現(xiàn)在第一行,所以,通過取第一行的方式不能獲取出錯點和出錯提示信息。
如果自己解析該輸出,一行一行地讀入,然后通過判斷首字符是否是“Caused by:” 也能抓取到出錯點和出錯信息。
最簡單的方式,還是使用正則表達(dá)式,可以比較簡單地實現(xiàn)抓取出錯點和出錯信息。例如:
代碼1:使用正則表達(dá)式獲取出錯點和出錯信息
String regEx = "Caused by:(.*)";
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(content);
boolean rs = mat.find();
System.out.println("found?" + rs);
System.out.println(mat.group(1));
代碼1的結(jié)果輸出:
org.apache.activemq.selector.ParseException: Parse error at line 0, column 0. Encountered: <EOF>
3、異常信息的獲取
雖然知道了如何找出錯點,但異常信息如何獲得呢?Exception.printStrackTrace()中雖然有出錯點信息,但都打到控制臺上去了,Exception.getStackTrace(),并不能獲得出錯點的提示信息。
一個應(yīng)對辦法就是捕獲e.printStrackTrace()輸出, 使用e.printStackTrace(PrintStream)方法,將異常棧信息先輸出到ByteOutputStream ,然后再將ByteOutputStream 轉(zhuǎn)換為字符串,就獲得了異常的完整輸出。代碼為:
代碼2:獲取完整異常信息
ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(baos));
String exception = baos.toString();
System.out.println("baos:" + exception);
完整的測試代碼--異常Caused by捕獲(注:該測試代碼中并沒有出現(xiàn)Caused by字樣,實際應(yīng)用代碼比較多,沒有放進(jìn)測試用例中):
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexpTest {
/**
* 讀取文件中的內(nèi)容
* @return
*/
public String readFile(){
try {
String fileName = "D:\\test2\\exception.log";
File f = new File(fileName);
FileInputStream fis = new FileInputStream(f);
int filesize = fis.available();
byte[] buffer = new byte[filesize];
fis.read(buffer);
return new String(buffer);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 正則表達(dá)式測試
*/
public void test(){
try {
String content = readFile();
System.out.println(content);
String regEx = "Caused by:(.*)";
Pattern pat = Pattern.compile(regEx);
Matcher mat = pat.matcher(content);
boolean rs = mat.find();
System.out.println("found?" + rs);
System.out.println(mat.group(1));
// for(int i=1;i<=mat.groupCount();i++){
// System.out.println("found:" + mat.group(i));
// }
} catch (Exception e) {
e.printStackTrace();
}
}
public void test2(){
try {
FileInputStream fis = new FileInputStream("d:\\test.txt");
fis.read();
} catch (Exception e) {
e.printStackTrace();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
e.printStackTrace(new PrintStream(baos));
String exception = baos.toString();
System.out.println("exception:" + exception);
}
}
public static void main(String[] args) {
RegexpTest rt = new RegexpTest();
//rt.test();
rt.test2();
}
4、獲取異常類型和出錯點還有一種簡單的方法
獲取出錯點類型:
e.getCause().getClass()
獲取出錯點信息(出錯原因):
e.getCause().getMessage()
代碼示例(注:實際代碼截取,不可直接運行):
@SuppressWarnings("unchecked")
@RequestMapping(value="/createSubscriber", method = RequestMethod.POST)
public @ResponseBody
WrappedResult createSubscriber(@ItemsRequestBody List<Map> list) {
LocalBrokerFacade facade = new LocalBrokerFacade(BrokerRegistry.getInstance().findFirst());
WrappedResult result = new WrappedResult();
try {
Map params = list.get(0);
String clientId = (String)params.get("clientId");
String subscriberName = (String)params.get("subscriberName");
String topicName = (String)params.get("topicName");
String selector = (String)params.get("selector");
// if("".equals(selector)){
// selector = null;
// }
facade.getBrokerAdmin().createDurableSubscriber(clientId,
subscriberName,topicName,selector);
result.setSuccessful(true);
} catch (Exception e) {
System.out.println("Exception:" + e.getCause().getClass() + "," + e.getCause().getMessage());
//log.error("createSubscriber failed.", e);
}
輸出:
Exception:class org.apache.activemq.selector.ParseException,Parse error at line 0, column 0. Encountered: <EOF>
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- java異常(Exception)處理機(jī)制詳解
- Android studio報: java.lang.ExceptionInInitializerError 錯誤
- AndroidApk混淆編譯時,報告java.io.IOException...錯誤解決辦法
- 如何解決Mybatis--java.lang.IllegalArgumentException: Result Maps collection already contains value for X
- java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list錯誤解決辦法
- SVN出現(xiàn)提示org.apache.subversion.javahl.ClientException: Attempted to lock an already-locked dir解決方案
- Java xml出現(xiàn)錯誤 javax.xml.transform.TransformerException: java.lang.NullPointerException
- Android異常 java.lang.IllegalStateException解決方法
- java.util.concurrent.ExecutionException 問題解決方法
相關(guān)文章
Spring Boot創(chuàng)建可執(zhí)行jar包的實例教程
這篇文章主要介紹了Spring Boot創(chuàng)建可執(zhí)行jar包的實例教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
java后臺實現(xiàn)js關(guān)閉本頁面,父頁面指定跳轉(zhuǎn)或刷新操作
這篇文章主要介紹了java后臺實現(xiàn)js關(guān)閉本頁面,父頁面指定跳轉(zhuǎn)或刷新操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Java注解機(jī)制之Spring自動裝配實現(xiàn)原理詳解
這篇文章主要為大家詳細(xì)介紹了Java注解機(jī)制之Spring自動裝配實現(xiàn)原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
基于@PostConstruct注解的使用,解決向靜態(tài)變量注入值
這篇文章主要介紹了基于@PostConstruct注解的使用,解決向靜態(tài)變量注入值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

