得益于框架支持的異步編程模型,錯(cuò)誤完全可以用 try catch 來(lái)捕獲。在編寫應(yīng)用代碼時(shí),所有地方都可以直接用 try catch 來(lái)捕獲異常。
// app/service/test.js |
按照正常代碼寫法,所有的異常都可以用這個(gè)方式進(jìn)行捕獲并處理,但是一定要注意一些特殊的寫法可能帶來(lái)的問題。打一個(gè)不太正式的比方,我們的代碼全部都在一個(gè)異步調(diào)用鏈上,所有的異步操作都通過 await 串接起來(lái)了,但是只要有一個(gè)地方跳出了異步調(diào)用鏈,異常就捕獲不到了。
// app/controller/home.js |
在這個(gè)場(chǎng)景中,如果 service.trade.check 方法中代碼有問題,導(dǎo)致執(zhí)行時(shí)拋出了異常,盡管框架會(huì)在最外層通過 try catch 統(tǒng)一捕獲錯(cuò)誤,但是由于 setImmediate 中的代碼『跳出』了異步鏈,它里面的錯(cuò)誤就無(wú)法被捕捉到了。因此在編寫類似代碼的時(shí)候一定要注意。
當(dāng)然,框架也考慮到了這類場(chǎng)景,提供了 ctx.runInBackground(scope) 輔助方法,通過它又包裝了一個(gè)異步鏈,所有在這個(gè) scope 里面的錯(cuò)誤都會(huì)統(tǒng)一捕獲。
class HomeController extends Controller { |
為了保證異常可追蹤,必須保證所有拋出的異常都是 Error 類型,因?yàn)橹挥?Error 類型才會(huì)帶上堆棧信息,定位到問題。
框架通過 onerror 插件提供了統(tǒng)一的錯(cuò)誤處理機(jī)制。對(duì)一個(gè)請(qǐng)求的所有處理方法(Middleware、Controller、Service)中拋出的任何異常都會(huì)被它捕獲,并自動(dòng)根據(jù)請(qǐng)求想要獲取的類型返回不同類型的錯(cuò)誤(基于 Content Negotiation)。
請(qǐng)求需求的格式 | 環(huán)境 | errorPageUrl 是否配置 | 返回內(nèi)容 |
---|---|---|---|
HTML & TEXT | local & unittest | - | onerror 自帶的錯(cuò)誤頁(yè)面,展示詳細(xì)的錯(cuò)誤信息 |
HTML & TEXT | 其他 | 是 | 重定向到 errorPageUrl |
HTML & TEXT | 其他 | 否 | onerror 自帶的沒有錯(cuò)誤信息的簡(jiǎn)單錯(cuò)誤頁(yè)(不推薦) |
JSON & JSONP | local & unittest | - | JSON 對(duì)象或?qū)?yīng)的 JSONP 格式響應(yīng),帶詳細(xì)的錯(cuò)誤信息 |
JSON & JSONP | 其他 | - | JSON 對(duì)象或?qū)?yīng)的 JSONP 格式響應(yīng),不帶詳細(xì)的錯(cuò)誤信息 |
onerror 插件的配置中支持 errorPageUrl 屬性,當(dāng)配置了 errorPageUrl 時(shí),一旦用戶請(qǐng)求線上應(yīng)用的 HTML 頁(yè)面異常,就會(huì)重定向到這個(gè)地址。
在 config/config.default.js 中
// config/config.default.js |
盡管框架提供了默認(rèn)的統(tǒng)一異常處理機(jī)制,但是應(yīng)用開發(fā)中經(jīng)常需要對(duì)異常時(shí)的響應(yīng)做自定義,特別是在做一些接口開發(fā)的時(shí)候??蚣茏詭У?onerror 插件支持自定義配置錯(cuò)誤處理方法,可以覆蓋默認(rèn)的錯(cuò)誤處理方法。
// config/config.default.js |
框架并不會(huì)將服務(wù)端返回的 404 狀態(tài)當(dāng)做異常來(lái)處理,但是框架提供了當(dāng)響應(yīng)為 404 且沒有返回 body 時(shí)的默認(rèn)響應(yīng)。
框架支持通過配置,將默認(rèn)的 HTML 請(qǐng)求的 404 響應(yīng)重定向到指定的頁(yè)面。
// config/config.default.js |
在一些場(chǎng)景下,我們需要自定義服務(wù)器 404 時(shí)的響應(yīng),和自定義異常處理一樣,我們也只需要加入一個(gè)中間件即可對(duì) 404 做統(tǒng)一處理:
// app/middleware/notfound_handler.js |
在配置中引入中間件:
// config/config.default.js |
更多建議: