日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

首先记录异常的根本原因

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 首先记录异常的根本原因 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Logback日志庫的0.9.30版本帶來了一個很棒的新功能:從根(最內部)異常而不是最外部異常開始記錄堆棧跟蹤。 當然,我的興奮與我貢獻了此功能無關。

用塞西爾·德·米勒(Cecil B. de Mille) 的話來解釋:“撰寫博客文章的方法是從堆棧跟蹤開始,直到達到高潮 ” –在這里:

詳細信息還不重要,但是從100英尺視圖中您可以看到很長的堆棧跟蹤,并且有多個相互包裹的異常( 引起 )。 我們將回到此堆棧跟蹤,但首先要介紹一些基礎知識。 如果拋出異常,則會以某種方式記錄日志,以顯示異常發生時瞬間堆棧的外觀。 在最底部,您將看到靜態的main()Thread.run() ,該方法通過調用直到第一個堆棧跟蹤行的方法進行處理,該行指示實際拋出異常的位置。 這非常方便,因為您可以看到導致異常的整個控制流程:

public class BookController {private final BookService bookService = new BookService();public void alpha() { beta(); }private void beta() { gamma(); }private void gamma() { bookService.delta(); }public static void main(String[] args) {new BookController().alpha();} }class BookService {private final BookDao bookDao = new BookDao();public void delta() { epsilon(); }private void epsilon() { zeta(); }private void zeta() { bookDao.eta(); } }class BookDao {public void eta() { theta(); }private void theta() { iota(); }public void iota() { throw new RuntimeException("Omega server not available"); } }

如果您不知道希臘字母 ,則可以從堆棧跟蹤中開始學習(請記住,控制流從底部開始并一直向上):

java.lang.RuntimeException: Omega server not availableat BookDao.iota(BookController.java:50)at BookDao.theta(BookController.java:48)at BookDao.eta(BookController.java:46)at BookService.zeta(BookController.java:41)at BookService.epsilon(BookController.java:39)at BookService.delta(BookController.java:37)at BookController.gamma(BookController.java:22)at BookController.beta(BookController.java:20)at BookController.alpha(BookController.java:18)at BookController.main(BookController.java:26)

太好了吧? 從上到下閱讀時,您可以說: iota()由theta()調用,而eta()則調用…清晰而簡單。 但是,如果有人決定包裝原始異常并重新拋出該異常怎么辦?

public class BookController {private static final Logger log = LoggerFactory.getLogger(BookController.class);private final BookService bookService = new BookService();public void alpha() { beta(); }private void beta() { gamma(); }private void gamma() {try {bookService.delta();} catch (Exception e) {throw new RuntimeException("Sorry, try again later", e);}}public static void main(String[] args) {try {new BookController().alpha();} catch (Exception e) {log.error("", e);}} }class BookService {private final BookDao bookDao = new BookDao();public void delta() { epsilon(); }private void epsilon() { zeta(); }private void zeta() {try {bookDao.eta();} catch (Exception e) {throw new RuntimeException("Unable to save order", e);}} }class BookDao {public void eta() { theta(); }private void theta() { iota(); }public void iota() {try {throw new RuntimeException("Omega server not available");} catch (Exception e) {throw new RuntimeException("Database problem", e);}} }

現在快速:在堆棧跟蹤中找到根本原因!

java.lang.RuntimeException: Sorry, try again laterat BookController.gamma(BookController.java:26)at BookController.beta(BookController.java:20)at BookController.alpha(BookController.java:18)at BookController.main(BookController.java:32) Caused by: java.lang.RuntimeException: Unable to save orderat BookService.zeta(BookController.java:51)at BookService.epsilon(BookController.java:45)at BookService.delta(BookController.java:43)at BookController.gamma(BookController.java:24)... 8 common frames omitted Caused by: java.lang.RuntimeException: Database problemat BookDao.iota(BookController.java:66)at BookDao.theta(BookController.java:60)at BookDao.eta(BookController.java:58)at BookService.zeta(BookController.java:49)... 11 common frames omitted Caused by: java.lang.RuntimeException: Omega server not availableat BookDao.iota(BookController.java:64)... 14 common frames omitted

原來main()不再是最后一行。 更糟糕的是,一切似乎都出現了亂碼,請嘗試再次閱讀希臘字母…現在讓我們回到原始的堆棧跟蹤中。 它來自Spring框架啟動失敗,想象它可能長達數頁。

為了方便起見,我添加了箭頭來標記您重構控制流所應遵循的路徑:從紅色箭頭的尾部( Thread.run() )開始,在中間的某個位置向上,然后…跳至橙色箭頭的尾部。 從橙色箭頭的頭部跳到綠色箭頭的尾巴,依此類推...不是很直觀,您不覺得嗎? 這個紅色的橢圓顯示了什么? 是的,這是失敗的根本原因(最內部的異常)。 另一方面,在最開始打印的異常(通常是您一開始就讀到的異常 )說明了創建DefaultAnnotationHandlerMapping#0時發生的錯誤 (是什么?)真正的錯誤( 沒有匹配的bean類型…… )被巧妙地隱藏了……

那么這個新功能到底是什么呢? 還是我們的簡單例子。 升級到0.9.30之后,只需在日志記錄模式的末尾添加%rEx (或等效的%rootException ):

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{ISO8601} | %-5level | %thread | %logger{1} | %m%n%rEx</pattern></encoder> </appender>

這將用我親自貢獻的默認堆棧跟蹤打印路由代替。 現在將打印相同的希臘程序:

java.lang.RuntimeException: Omega server not availableat BookDao.iota(BookController.java:64) Wrapped by: java.lang.RuntimeException: Database problemat BookDao.iota(BookController.java:66)at BookDao.theta(BookController.java:60)at BookDao.eta(BookController.java:58)at BookService.zeta(BookController.java:49) Wrapped by: java.lang.RuntimeException: Unable to save orderat BookService.zeta(BookController.java:51)at BookService.epsilon(BookController.java:45)at BookService.delta(BookController.java:43)at BookController.gamma(BookController.java:24) Wrapped by: java.lang.RuntimeException: Sorry, try again laterat BookController.gamma(BookController.java:26)at BookController.beta(BookController.java:20)at BookController.alpha(BookController.java:18)at BookController.main(BookController.java:32)

請仔細將其與先前的輸出進行比較。 首先,第一行指出了問題所在。 在大多數情況下,您可能都不會跳過“ 由...引起的 ”例外,因此可能會跳過其余部分。 其次,控制流是不間斷且連續的–您仍然可以從上至下閱讀,反之亦然。 最后但并非最不重要的一點是–同時保留了異常被包裹的事實,但不會使堆棧跟蹤混亂。

現在您應該看到利用%rEx打印的原始Spring異常:

觀察結果完全相同:問題的根本原因從一開始就出現,從而縮短了需要研究問題的時間。 同樣,在分析控制流時,不會跳躍-Thread.main()位于底部,您可以連續讀取底部到頂部的軌跡。

如果您使用堆棧跟蹤(在開發中或在生產/支持中)進行大量工作–請考慮切換到根本原因優先日志記錄。 每次您分析特定異常時,它將節省您幾秒鐘的時間。 但是我還注意到,經驗不足的開發人員有時甚至不知道“ 由...引起的 ”規則: 找到第一個異常并查看最后一個“由...引起的” –仍然不清楚問題到底是什么,僅查看最外部,最不具體,最通用的錯誤。 這也將對他們有幫助。

順便說一下,如果您完全避免包裝和重新拋出異常,則可以避免所有這些麻煩。 我知道,我們經常會因檢查異常而被迫這么做……

參考: 日志異常的根源首先來自我們的JCG合作伙伴Tomek Nurkiewicz,位于NoBlogDefFound

編碼愉快! 不要忘記分享!

相關文章:

  • Java日志混亂
  • 正確記錄應用程序的10個技巧
  • 使用AspectJ,Javassist和Java Proxy進行代碼注入的實用介紹
  • Java最佳實踐系列
  • 每個程序員都應該知道的事情
  • 生存在狂野西部開發過程中的9條提示
  • 軟件設計法則

翻譯自: https://www.javacodegeeks.com/2011/09/logging-exceptions-root-cause-first.html

總結

以上是生活随笔為你收集整理的首先记录异常的根本原因的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 双性尿奴穿贞c带憋尿 | 亚州精品国产精品乱码不99按摩 | 国产网红在线观看 | 欧美综合网站 | 成人一级视频 | 久久这里有精品视频 | 蜜臀久久99精品久久久画质超高清 | 一级黄色美女 | 日韩欧美视频一区二区三区 | 国产在线999 | 轻点好疼好大好爽视频 | 国产首页 | 少妇熟女视频一区二区三区 | 亚洲精品一区二区三区四区乱码 | 亚洲在线第一页 | 国产一二区在线 | 久操视频免费在线观看 | 99一区二区三区 | 日日爱夜夜操 | 日日夜夜人人 | 香蕉免费在线视频 | 国产麻豆一区二区三区 | 亚洲理论中文字幕 | 久久免费看 | 九色网站在线观看 | 欧美乱插 | 麻豆app在线观看 | 日韩精品成人一区 | 成人精品动漫 | www.色啪啪.com| 美国少妇在线观看免费 | 亚洲xx在线 | 成人av在线播放网站 | 91ts人妖另类精品系列 | 亚洲a在线观看 | 综合色婷婷一区二区亚洲欧美国产 | 国产福利一区二区 | 美女羞羞动态图 | 国产精品伦理一区 | 99热91| 毛片无码免费无码播放 | 麻豆三级在线观看 | 激情综合久久 | 伊人动漫 | 日韩精品一区二区三区在线观看 | 精品影视一区二区 | 狠狠干2024 | 日本少妇xxx | 特黄特色大片免费 | 美女色黄网站 | 久久人妻少妇嫩草av | 亚洲天堂一区二区在线观看 | 日本黄色片视频 | 欧美日韩视频免费 | 免费黄色a级片 | 色一情一乱一乱一区91av | 人妻偷人精品一区二区三区 | 亚洲free性xxxx护士白浆 | 双腿张开被9个男人调教 | 男受被做哭激烈娇喘gv视频 | av影视天堂 | 好色视频tv | 日韩精品一区二区三区高清免费 | 亚洲香蕉 | 99精品免费 | 中文字幕国产 | 成av在线 | 久久99精品久久久久久噜噜 | 免费的av网站 | 亚洲黄色在线 | 久久精品成人一区二区三区蜜臀 | 怡红院av久久久久久久 | 久久久久久网址 | 国产精品亚洲一区二区无码 | 亚洲欧美精品一区二区 | 国产色一区二区 | 日日操狠狠干 | 亚洲av成人精品毛片 | 精品在线第一页 | 麻豆porn| 亚洲永久精品国产 | 亚洲狠狠爱| 91天天看 | 久久精品国产亚洲 | 高潮毛片又色又爽免费 | 亚洲综合一区中 | 四虎婷婷| 秋霞国产午夜精品免费视频 | 美女黄色一级视频 | 日韩成人福利 | 久草热在线视频 | 18成人在线观看 | 男女无遮挡猛进猛出 | 91视频网址 | 国产午夜成人久久无码一区二区 | 国产综合日韩 | 日本aⅴ在线观看 | 亚洲熟女一区二区 | 中文字幕日韩亚洲 |