沒想過的前端錯誤處理可能比你有做的還多
by
LINE Developers Taiwan
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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