詳解以go思想去處理js異常拋棄trycatch
errors
錯誤處理在編程中是不可避免的一部分,在程序開發(fā)過程中,不可必要的會出現(xiàn)各種的錯誤,是人為也可能是失誤,任何不可預料的可能都會發(fā)生
為了更好的保證程序的健壯性和穩(wěn)定性
我們必須要對錯誤處理有更好的認識
最近迷上了golang的錯誤處理哲學,希望由淺入深的總結(jié)一下自己的思考和看得見的思考
?? 用 error 表示可能出現(xiàn)的錯誤,用throw強制拋出錯誤
錯誤處理的方式
通常情況下 錯誤處理的方式無非不過兩種
- 泛處理
- 精處理
其實都很好理解
// 偽代碼
try {
const file = await readFile('../file')
const content = filterContent(file)
} catch (e) {
alert('xxxx',e.msg)
}
泛處理指的是對所有可能的錯誤都使用相同的處理方式,比如在代碼中使用相同統(tǒng)一的錯誤提示信息
這種方式適用于一些簡單的,不太可能發(fā)生的錯誤,不如文件不存在,網(wǎng)絡(luò)連接超時等。
對于更加復雜的錯誤,應該使用精處理,即根據(jù)具體情況對不同類型的錯誤進行特定的處理
const [readErr,readFile] = await readFile('../file')
if (readErr) {
// 處理讀取錯誤
return
}
const [filterErr,filterContent] = filterContent(readFile)
if (filterErr) {
// 處理過濾錯誤
return
}
精處理可以讓我們把控計劃的每一步,問題也很顯然暴露了出來,過于麻煩
在實際開發(fā)當中,我們需要根據(jù)實際情況選擇適當?shù)姆绞竭M行錯誤處理。
由于本人是精處理分子,基于此開發(fā)了一個js版本的errors包
如何定義一個錯誤
import { Errors } from '@memo28/utils'
Errors.News('err')
如何給一個錯誤分類
import { Errors } from '@memo28/utils'
Errors.News('err', { classify: 1 })
如何判斷兩個錯誤是相同類型
import { Errors } from '@memo28/utils'
Errors.As(Errors.News('err', { classify: 1 }),
Errors.News('err2', { classify: 1 })) // true
Errors.As(Errors.News('err', { classify: 1 }),
Errors.News('err2', { classify: 2 })) // false
一個錯誤包含了哪些信息?
Errors.New('as').info() // { msg: 'as' , classify: undefined }
Errors.New('as').trace() // 打印調(diào)用棧
Errors.New('as').unWrap() // 'as'
最佳實踐
import { AnomalousChain, panicProcessing } from '@memo28/utils'
class A extends AnomalousChain {
// 定義錯誤處理函數(shù),
// 當每次執(zhí)行的被 panicProcessing 裝飾器包裝過的函數(shù)都會檢查 是否存在 this.errors 是否為 ErrorsNewResult 類型
// 如果為 ErrorsNewResult 類型則 調(diào)用 panicProcessing的onError回調(diào) 和 skip函數(shù)
skip(errors: ErrorsNewResult | null): this {
console.log(errors?.info().msg)
return this
}
@panicProcessing()
addOne(): this {
console.log('run one')
super.setErrors(Errors.New('run one errors'))
return this
}
@panicProcessing({
// 在 skip 前執(zhí)行
onError(error) {
console.log(error.unWrap())
},
// onRecover 從錯誤中恢復, 當返回的是true時 繼續(xù)執(zhí)行addTwo內(nèi)邏輯,反之
// onRecover(erros) {
// return true
// },
})
addTwo(): this {
console.log('run two')
return this
}
}
new A().addOne().addTwo()
// output
run one
run one errors // in onError
run one errors // in skip fn
以上就是詳解以go思想去處理js異常拋棄trycatch的詳細內(nèi)容,更多關(guān)于go思想處理js異常的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解
Stream?的實現(xiàn)思想就是將數(shù)據(jù)處理流程抽象成了一個數(shù)據(jù)流,每次加工后返回一個新的流供使用。這篇文章主要介紹了Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù),需要的朋友可以參考下2022-01-01
破解IDEA(Goland)注冊碼設(shè)置 license server一直有效不過期的過程詳解
這篇文章主要介紹了破解IDEA(Goland)注冊碼設(shè)置 license server一直有效不過期,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
Golang中使用Date進行日期格式化(沿用Java風格)
這篇文章主要介紹了Golang中使用Date進行日期格式化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04

