IDEA Tips:Debug時(shí)如何優(yōu)雅地制造異常?
拋異常相信大家都會(huì)吧?只需要這樣就可以了:
throw?new?RuntimeException("didispace.com");
但是,在開發(fā)過程中有一些情況,我們需要測(cè)試程序?qū)Ξ惓5奶幚磉壿嬍欠裾_,這個(gè)時(shí)候就需要我們?cè)诔绦蜻\(yùn)行時(shí)主動(dòng)的拋出異常才會(huì)觸發(fā)相關(guān)邏輯來驗(yàn)證正確性,比較常見的場(chǎng)景有:事務(wù)是否會(huì)回滾、Web層的統(tǒng)一異常處理等等。
這個(gè)時(shí)候,你是如何去制造異常,來支持你的調(diào)試呢?
下面我就以前寫的Spring Boot教程(https://blog.didispace.com/spring-boot-learning-2x/)里一個(gè)事務(wù)處理的例子為場(chǎng)景,給大家看看一些常見的調(diào)試操作以及今天要講的更優(yōu)雅的操作。
案例說明
先介紹下場(chǎng)景,這是一個(gè)用Spring Data JPA實(shí)現(xiàn)的數(shù)據(jù)庫(kù)操作案例,右側(cè)UserService里一個(gè)事務(wù)操作,里面含有5句User表的插入語(yǔ)句。

因?yàn)?code style="padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;font-size: 12px;color: rgb(71, 193, 168);">@Transactional注解存在,所以saveSomeUsers函數(shù)下的數(shù)據(jù)插入要么都成功,要么都失敗。成功很好測(cè)試,要測(cè)試失敗的話,則需要我們讓這個(gè)函數(shù)拋出異常才能觸發(fā)回滾操作。
擼起袖子就是拋
為了拋出異常以驗(yàn)證事務(wù)是否能回滾,很多小伙伴是這樣干的:

直接在這個(gè)函數(shù)里手工拋出異常,很粗暴很直接,是可以完成目標(biāo)。雖然這種方法在單元測(cè)試中作為一種場(chǎng)景是可以的,但如果在復(fù)雜的業(yè)務(wù)過程中這樣做就不那么優(yōu)雅了,因?yàn)槟銣y(cè)試好還要?jiǎng)h掉它,如果忘記了,那就是直接寫了個(gè)Bug。
優(yōu)雅地拋異常
實(shí)際上IDEA提供了自由拋異常的功能,只需要在Debug的時(shí)候,右鍵前幾天介紹的回退操作Reset Frame(https://blog.didispace.com/intellij-idea-tips-005/)位置,就可以看到如下圖箭頭所標(biāo)的Throw Exception操作了。

然后在彈出框中,你就可以編寫你想要拋出的異常了:

是不是很簡(jiǎn)單呢?趕緊打開IDEA試一試吧!
我正在連載IDEA專題(https://space.bilibili.com/396803537)的視頻內(nèi)容,感興趣的小伙伴可以關(guān)注我的B站或視頻號(hào)喲!
推薦閱讀
你好,我是程序猿DD,10年開發(fā)老司機(jī)、阿里云MVP、騰訊云TVP、出過書、創(chuàng)過業(yè)、國(guó)企4年互聯(lián)網(wǎng)6年。10年前畢業(yè)加入宇宙行,工資不高、也不算太忙,業(yè)余堅(jiān)持研究技術(shù)和做自己想做的東西。4年后離開國(guó)企,加入永輝互聯(lián)網(wǎng)板塊的創(chuàng)業(yè)團(tuán)隊(duì),從開發(fā)、到架構(gòu)、到合伙人。一路過來,給我最深的感受就是一定要不斷學(xué)習(xí)并關(guān)注前沿。只要你能堅(jiān)持下來,多思考、少抱怨、勤動(dòng)手,就很容易實(shí)現(xiàn)彎道超車!所以,不要問我現(xiàn)在干什么是否來得及。如果你看好一個(gè)事情,一定是堅(jiān)持了才能看到希望,而不是看到希望才去堅(jiān)持。相信我,只要堅(jiān)持下來,你一定比現(xiàn)在更好!如果你還沒什么方向,可以先關(guān)注我,這里會(huì)經(jīng)常分享一些前沿資訊,幫你積累彎道超車的資本。
