Java利用Exception如何實(shí)現(xiàn)捕獲并顯示?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
站在用戶的角度思考問題,與客戶深入溝通,找到榆次網(wǎng)站設(shè)計(jì)與榆次網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋榆次地區(qū)。
Java Exception 捕獲和顯示實(shí)例詳解
在進(jìn)行Java B/S架構(gòu)開發(fā)時(shí),經(jīng)常有這樣的場景:后端處理業(yè)務(wù)邏輯,前端負(fù)責(zé)展示,當(dāng)后端處理出現(xiàn)異常時(shí),如何把錯(cuò)誤信息展示給前臺呢?錯(cuò)誤信息棧通常很多,對開發(fā)人員查找問題比較方便,但對于客戶來說,打一堆的錯(cuò)誤信息,無疑是對他們感官的一種摧殘,如何捕捉最重要的信息顯示到客戶端呢?該信息要求簡明扼要,指向出錯(cuò)點(diǎn),且應(yīng)指明異常的類型。
在很多情況下Exception的 getMessage()方法返回空的值,如果使用該方式則會在前端顯示空值。我們要顯示的重要信息有兩個(gè):
1、異常類型如何獲得呢?
可以通過Exception 的getClass().getName()方法來實(shí)現(xiàn)。
2、出錯(cuò)點(diǎn)如何獲得呢?
出錯(cuò)點(diǎn)信息一般在“Cause by:”標(biāo)識開始的行。如果能抓取到該行,則可取出異常信息,一個(gè)異常棧例子如下:
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)在第一行,所以,通過取第一行的方式不能獲取出錯(cuò)點(diǎn)和出錯(cuò)提示信息。
如果自己解析該輸出,一行一行地讀入,然后通過判斷首字符是否是“Caused by:” 也能抓取到出錯(cuò)點(diǎn)和出錯(cuò)信息。
最簡單的方式,還是使用正則表達(dá)式,可以比較簡單地實(shí)現(xiàn)抓取出錯(cuò)點(diǎn)和出錯(cuò)信息。例如:
代碼1:使用正則表達(dá)式獲取出錯(cuò)點(diǎn)和出錯(cuò)信息
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、異常信息的獲取
雖然知道了如何找出錯(cuò)點(diǎn),但異常信息如何獲得呢?Exception.printStrackTrace()中雖然有出錯(cuò)點(diǎn)信息,但都打到控制臺上去了,Exception.getStackTrace(),并不能獲得出錯(cuò)點(diǎn)的提示信息。
一個(gè)應(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字樣,實(shí)際應(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、獲取異常類型和出錯(cuò)點(diǎn)還有一種簡單的方法
獲取出錯(cuò)點(diǎn)類型:
e.getCause().getClass()
獲取出錯(cuò)點(diǎn)信息(出錯(cuò)原因):
e.getCause().getMessage()
代碼示例(注:實(shí)際代碼截取,不可直接運(yùn)行):
@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>
看完上述內(nèi)容,你們掌握J(rèn)ava利用Exception如何實(shí)現(xiàn)捕獲并顯示的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
新聞標(biāo)題:Java利用Exception如何實(shí)現(xiàn)捕獲并顯示
標(biāo)題網(wǎng)址:http://muchs.cn/article22/pdjocc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、品牌網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)