沒想過的前端錯誤處理可能比你有做的還多
by
LINE Developers Taiwan
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
沒想過的前端錯誤處理 可能比你有做的還多
Slide 2
Slide 2 text
YU LINE Taiwan Content Dev TECHFRESH 北科資⼯⼤四 SITCON 2022 ⾏銷組組員
Slide 3
Slide 3 text
為什麼我今天會想分享這個主題? 加分條件 1. 使⽤ TypeScript 2. 未使⽤現成的 GitHub API client(Octokit)串接 GitHub API 3. 有處理例外狀況(Error handling) 4. 有 deploy ⾄線上環境
Slide 4
Slide 4 text
⼤部分⼈能想到的作法 1 try … catch 2 顯⽰錯誤訊息 給使⽤者看 3 輸出到 console ⽅便⾃⼰ debug
Slide 5
Slide 5 text
我們能做的更好 嗎?
Slide 6
Slide 6 text
有做好例外處理的程式應該要... 對使⽤者來說 對開發者來說 有整合監控系統記錄錯誤 有容錯能⼒(Fault tolerance) 圖片來源:Flaticon.com
Slide 7
Slide 7 text
LINE-Pay(v)_W238_n.png 什麼是容錯能⼒( Fault tolerance )? 例⼦:餐廳收款系統 圖片來源:Flaticon.com、LINE Pay 官網
Slide 8
Slide 8 text
為什麼我們需要錯誤監控系統? 圖片來源:Flaticon.com
Slide 9
Slide 9 text
⽬前市⾯上有的錯誤監控服務 圖片來源:Sentry、The LINUX Foundation、 WIKIPEDIA 、GitHub、DATADOG
Slide 10
Slide 10 text
Sentry 功能介紹
Slide 11
Slide 11 text
什麼是 Sentry? 圖片來源:Flaticon.com 開源可⾃架 前端主流的監控服務之⼀
Slide 12
Slide 12 text
常⽤的基本功能 1 錯誤資訊⾴⾯ 2 錯誤搜尋 3 即時錯誤通知
Slide 13
Slide 13 text
常⽤的基本功能 1 錯誤資訊⾴⾯ 2 錯誤搜尋 3 即時錯誤通知
Slide 14
Slide 14 text
基本偵錯資訊 Sentry: Scopes and Hubs
Slide 15
Slide 15 text
Stack Trace
Slide 16
Slide 16 text
Source Map Sentry: Source Maps
Slide 17
Slide 17 text
Breadcrumbs
Slide 18
Slide 18 text
詳細錯誤資訊
Slide 19
Slide 19 text
相關統計數據
Slide 20
Slide 20 text
有錯誤資訊⾴⾯的好處 提昇修復 bug 的效率 幫助我們判斷處理的 優先度 圖片來源:Flaticon.com
Slide 21
Slide 21 text
常⽤的基本功能 1 錯誤資訊⾴⾯ 2 錯誤搜尋 3 即時錯誤通知
Slide 22
Slide 22 text
錯誤搜尋
Slide 23
Slide 23 text
常⽤的基本功能 1 錯誤資訊⾴⾯ 2 錯誤搜尋 3 即時錯誤通知
Slide 24
Slide 24 text
Discord 即時通知 Sentry → Discord
Slide 25
Slide 25 text
官⽅整合設定
Slide 26
Slide 26 text
也可以透過 WebHook DIY
Slide 27
Slide 27 text
設定錯誤通知條件
Slide 28
Slide 28 text
即時通知的好處 能整合我們常⽤的 通訊軟體做到即時通知 在使⽤者/客⼾回報問題前 就能主動進⾏修復 圖片來源:Flaticon.com
Slide 29
Slide 29 text
聽起來好像很厲害,這樣我們還需要 try catch 和顯⽰錯誤訊息嗎? 圖片來源:風傳媒
Slide 30
Slide 30 text
我們仍然需要 try catch 以及各個前端框架的錯誤捕獲機制來做錯誤處理 圖片來源:Flaticon.com
Slide 31
Slide 31 text
也需要錯誤訊息,這對使⽤者體驗(UX)很重要 圖片來源:Flaticon.com
Slide 32
Slide 32 text
捕獲程式發⽣的錯誤 顯⽰錯誤訊息 給使⽤者看 將錯誤記錄 到監控系統
Slide 33
Slide 33 text
捕獲程式發⽣的錯誤 顯⽰錯誤訊息 給使⽤者看 將錯誤記錄 到監控系統
Slide 34
Slide 34 text
瀏覽器 / 原⽣ JavaScript 前端框架 錯誤捕獲機制 圖片來源:WIKIPEDIA
Slide 35
Slide 35 text
錯誤捕獲機制 瀏覽器 / 原⽣ JavaScript 圖片來源:WIKIPEDIA 1. try ... catch 2. Promise.Prototype.catch() 3. window.onerror
Slide 36
Slide 36 text
window.onerror
Slide 37
Slide 37 text
五個參數的⽤途
Slide 38
Slide 38 text
前端框架的錯誤捕獲機制 getDerivedStateFromError componentDidCatch onErrorCaptured handleError 圖片來源:WIKIPEDIA
Slide 39
Slide 39 text
can help you ErrorBoundary
Slide 40
Slide 40 text
如何實作 ErrorBoundary getDerivedStateFromError componentDidCatch onErrorCaptured handleError 圖片來源:WIKIPEDIA
Slide 41
Slide 41 text
ErrorBoundary 介⾯定義 State: • hasError: false Props: • children • fallback(顯⽰錯誤訊息的元件)
Slide 42
Slide 42 text
ErrorBoundary 實作邏輯 渲染 children 時 有沒有發⽣錯誤 檢查 hasError 的狀態 true 開始渲染 渲染 fallback false 沒有 正常顯⽰ children 將 hasError 設成 true,並做錯誤處理 有
Slide 43
Slide 43 text
什麼元件需要⽤ ErrorBoundary 包? 當壞掉時 不會影響其他在元件樹上 同層的元件運作的元件 網⾴程式的進入點
Slide 44
Slide 44 text
為什麼進入點需要包 ErrorBoundary? 圖片來源:Flaticon.com
Slide 45
Slide 45 text
“當壞掉時,不會影響其他在元件樹上同 層的元件運作的元件。” 這句話是什麼意思?
Slide 46
Slide 46 text
ErrorBoundary 圖片來源:Flaticon.com
Slide 47
Slide 47 text
如果每個都包會有什麼問題? ● 不是所有元件都需要包 ErrorBoundary ● 會影響效能 ● 可能會產⽣不好的使⽤者體驗
Slide 48
Slide 48 text
壞⼀半的 UI === 全壞爛的 UX ErrorBoundary
Slide 49
Slide 49 text
壞⼀半的 UI === 全壞爛的 UX
Slide 50
Slide 50 text
那要怎麼判斷呢?
Slide 51
Slide 51 text
當這個元件壞掉時, 其他同層的元件該跟著消失嗎? 遍歷整顆元件樹,並對每個元件問這個問題
Slide 52
Slide 52 text
以 X 為例⼦模擬⼀遍
Slide 53
Slide 53 text
以 X 為例⼦模擬⼀遍
Slide 54
Slide 54 text
捕獲程式發⽣的錯誤 顯⽰錯誤訊息 給使⽤者看 將錯誤記錄 到監控系統
Slide 55
Slide 55 text
顯⽰錯誤訊息實作
Slide 56
Slide 56 text
捕獲程式發⽣的錯誤 顯⽰錯誤訊息 給使⽤者看 將錯誤記錄 到監控系統
Slide 57
Slide 57 text
將錯誤紀錄到 Sentry 當程式進到 try...catch 的 catch 區塊時 ErrorBoundary 中發⽣ 錯誤時觸發的 hook
Slide 58
Slide 58 text
可能會拋出錯誤的 function 第三⽅ library 中 ⽂件明確寫出可能會拋出 錯誤的 function 開發團隊⾃⼰寫 且確定可能會拋出錯誤的 utility function
Slide 59
Slide 59 text
把 fetch 重新封裝
Slide 60
Slide 60 text
把 fetch 重新封裝
Slide 61
Slide 61 text
⽤ axios 更⽅便 請求失敗 回應失敗 axios: Interceptors 圖片來源:Flaticon.com、 WIKIPEDIA
Slide 62
Slide 62 text
window.onerror 呢? Sentry 會幫我們⾃動捕獲所有的 uncaught error 除非你對 uncaught error 需要做其他的錯誤處理,不然你不會需要⽤到。 圖片來源:Flaticon.com
Slide 63
Slide 63 text
最後的⼀些⼩建議 ● 並不是所有專案都需要做錯誤監控,也不需要⼀次做到位 ● 如果有專案有整合錯誤監控系統要好好善⽤ ● 注意不要將使⽤者的機密資訊傳到錯誤監控系統 ● 容錯能⼒的「粒度」不⼀定要這麼細
Slide 64
Slide 64 text
Q & A yu2001 @justYu2001 圖片來源:Discord、 WIKIPEDIA
Slide 65
Slide 65 text
No content