controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常
controller的異常處理以及service層的事務控制
最近寫代碼涉及到一些事務,上午終于把代碼給理順了,之前不太清楚在哪里做異常處理,導致代碼遍地try-catch,相當難看。
還是基于controller-service-dao三層來寫代碼,從入口開始,controller層的方法對應的是某個url,面向的是應用人員,應該返回他們能讀懂的信息,所以controller必須做異常處理,一般來說會有統一的異常處理方法;
service層面向的是controller,service層中的某些方法,必須保證其事務,所以在service層進行事務控制是相當必要的,對于多條sql進行事務控制,如果某個sql執行失敗,那么應當對已經執行的sql語句進行回滾;
dao層更多是單一的sql語句,沒有必要進行事務控制,因為事務開銷并不便宜(官方原話);
基于以上三點,回頭再思考關于異常的處理,一般情況應該把異常網上拋,一直拋到最終處理的那一層,所以對于dao層和service其實是沒有必要進行try-catch的,直接往上拋異常就可以。
與之對應的,是spring的事務配置,默認情況下,spring只對運行時異常進行回滾,如果在dao層處理了異常,那么需要進行額外的配置,spring才會對異常進行回滾,常用的配置是@Transactional(rollbackFor=Exception.class)
順便提一個java知識點,關于try-catch-finally中,finally的作用,finally設計之初就是為了關閉資源,如果在finally中使用return語句,會覆蓋try或者catch的返回值,最常見的就是覆蓋異常,即便catch往上拋了異常,也會被覆蓋,返回finally中return語句的返回值。
service事務拋錯回滾后,controller在調用該service處會拋出異常嗎?在controller做了異常的處理的情況下,該異常會到controller來么?
因為controller層調用了service層的業務邏輯,因此service出錯controller必將聯動報錯。
service將異常拋給controller層,controller做異常捕捉并能夠進行處理。
controller層 trycatch不影響service層拋出的異常
1.controller層 trycatch不影響service層拋出的異常 因為 service層利用spring
的aop控制異常, 而controller層 try catch 不影響, aop完成之后,才會到controller層,所以不影響,但如果在service try catch 一定要拋出異常 否則 不回滾, @Transactional(rollbackFor = Exception.class) 加這個 不僅僅是RuntimeException
一般Service層怎么向Controller層傳遞業務處理結果呢?
有個疑問想問問大家,就是關于Java三層框架層之間返回業務結果如何處理比較好,以及異常一般怎么處理
比如,
我service層處理邏輯,有四種情況,這種時候我該怎么給controller層返回處理結果?
還有就是.如果我service層發生了異常,比如數據庫異常啦,文件讀寫異常這些,我應該直接在service層catch處理,還是直接拋出到controller層再catch…
我之前也寫過一個在service層catch異常,然后封裝為自定義異常再拋出到controller的.但是這樣處理程序邏輯感覺也不是特別好…
第一個問題,如何返回多種情況傳遞給controller,這個不是很簡單嗎,方法是有返回值的啊,主要是你返回值的數據結構是否合適,你可以用枚舉,可以用map,可以是集合,可以自己封裝dto(data transfer object)
第二個問題,如何處理異常呢,最好不要在service層進行try catch,因為現在基本上都是在service層作業務處理,事務會配置在這一層,try catch會導致事務無法回滾,當然你也可以try catch,但是一定要拋出runTimeException才可以回滾事務。最好的做法是在controller層使用aop進行try catch統一管理
一個關于service層拋異常,controller處理的問題
往數據庫插入數據,由于service拋異常,雖然事務回滾了,但是程序已經不能在執行下去了,那么我在controller的處理沒了用處,頁面正等著controller的返回結果呢,也沒了。難道要我在controller手動 try…cathch嗎?那也太麻煩了。
我說得清楚點:controller等著service的返回結果封裝返回結果集,頁面等著對結果集處理,然后進行下一步操作。現在service崩了,一條線都崩了。難道只能在controller手動try…catch,然后在catch里封裝另一個返回結果集嗎?
spring有統一的異常處理,封裝統一的錯誤返回
總結
以上是生活随笔為你收集整理的controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot整合阿里云OSS上传
- 下一篇: Java基础day18