詳解以go思想去處理js異常拋棄trycatch
errors
錯(cuò)誤處理在編程中是不可避免的一部分,在程序開發(fā)過(guò)程中,不可必要的會(huì)出現(xiàn)各種的錯(cuò)誤,是人為也可能是失誤,任何不可預(yù)料的可能都會(huì)發(fā)生
為了更好的保證程序的健壯性和穩(wěn)定性
我們必須要對(duì)錯(cuò)誤處理有更好的認(rèn)識(shí)
最近迷上了golang
的錯(cuò)誤處理哲學(xué),希望由淺入深的總結(jié)一下自己的思考和看得見的思考
?? 用 error
表示可能出現(xiàn)的錯(cuò)誤,用throw
強(qiáng)制拋出錯(cuò)誤
錯(cuò)誤處理的方式
通常情況下 錯(cuò)誤處理的方式無(wú)非不過(guò)兩種
- 泛處理
- 精處理
其實(shí)都很好理解
// 偽代碼 try { const file = await readFile('../file') const content = filterContent(file) } catch (e) { alert('xxxx',e.msg) }
泛處理指的是對(duì)所有可能的錯(cuò)誤都使用相同的處理方式,比如在代碼中使用相同統(tǒng)一的錯(cuò)誤提示信息
這種方式適用于一些簡(jiǎn)單的,不太可能發(fā)生的錯(cuò)誤,不如文件不存在,網(wǎng)絡(luò)連接超時(shí)等。
對(duì)于更加復(fù)雜的錯(cuò)誤,應(yīng)該使用精處理,即根據(jù)具體情況對(duì)不同類型的錯(cuò)誤進(jìn)行特定的處理
const [readErr,readFile] = await readFile('../file') if (readErr) { // 處理讀取錯(cuò)誤 return } const [filterErr,filterContent] = filterContent(readFile) if (filterErr) { // 處理過(guò)濾錯(cuò)誤 return }
精處理可以讓我們把控計(jì)劃的每一步,問(wèn)題也很顯然暴露了出來(lái),過(guò)于麻煩
在實(shí)際開發(fā)當(dāng)中,我們需要根據(jù)實(shí)際情況選擇適當(dāng)?shù)姆绞竭M(jìn)行錯(cuò)誤處理。
由于本人是精處理分子,基于此開發(fā)了一個(gè)js
版本的errors
包
如何定義一個(gè)錯(cuò)誤
import { Errors } from '@memo28/utils' Errors.News('err')
如何給一個(gè)錯(cuò)誤分類
import { Errors } from '@memo28/utils' Errors.News('err', { classify: 1 })
如何判斷兩個(gè)錯(cuò)誤是相同類型
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
一個(gè)錯(cuò)誤包含了哪些信息?
Errors.New('as').info() // { msg: 'as' , classify: undefined } Errors.New('as').trace() // 打印調(diào)用棧 Errors.New('as').unWrap() // 'as'
最佳實(shí)踐
import { AnomalousChain, panicProcessing } from '@memo28/utils' class A extends AnomalousChain { // 定義錯(cuò)誤處理函數(shù), // 當(dāng)每次執(zhí)行的被 panicProcessing 裝飾器包裝過(guò)的函數(shù)都會(huì)檢查 是否存在 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 從錯(cuò)誤中恢復(fù), 當(dāng)返回的是true時(shí) 繼續(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的詳細(xì)內(nèi)容,更多關(guān)于go思想處理js異常的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go使用snmp庫(kù)查詢mib數(shù)據(jù)案例代碼
go語(yǔ)言使用snmp庫(kù)中的 k-sone/snmpgo 實(shí)現(xiàn)相關(guān)mib查詢,本文通過(guò)實(shí)例代碼給大家介紹了go使用snmp庫(kù)查詢mib數(shù)據(jù),感興趣的朋友跟隨小編一起看看吧2023-10-10Go語(yǔ)言的http/2服務(wù)器功能及客戶端使用
Golang 有一個(gè)很棒的自帶 http 服務(wù)器軟件包,不用說(shuō)就是: net/http, 它非常簡(jiǎn)單,但是功能非常強(qiáng)大。下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言的http/2服務(wù)器功能及客戶端使用的相關(guān)資料,需要的朋友可以參考下2018-09-09如何使用大學(xué)教育郵箱下載golang等軟件(推薦)
這篇文章主要介紹了如何使用大學(xué)教育郵箱下載goland等軟件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09

Go項(xiàng)目編寫Makefile規(guī)則文件概述

Go 1.21新增的slices包中切片函數(shù)用法詳解