json.Unmarshall我正在測(cè)試失敗并返回的場(chǎng)景&json.SyntaxError{msg:"unexpected end of JSON input", Offset:0}代碼是這樣的:err = json.Unmarshal(input, &data)if err != nil { return nil, err}測(cè)試用例預(yù)計(jì)會(huì)出現(xiàn)這種類(lèi)型的錯(cuò)誤:{...errorType: &json.SyntaxError{},...}斷言是這樣的:assert.Equal(t, tt.errorType, err)這是失敗的,因?yàn)殄e(cuò)誤消息不同:expected: &json.SyntaxError{msg:"", Offset:0}actual : &json.SyntaxError{msg:"unexpected end of JSON input", Offset:0}我該如何處理?也許利用Error()?
1 回答

眼眸繁星
TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個(gè)贊
首先,不可能直接制作這個(gè)哨兵錯(cuò)誤:
_ = &json.SyntaxError{msg: "unexpected end of JSON input", Offset: 0} // msg field is not exported
最接近的是檢查錯(cuò)誤類(lèi)型。為此,請(qǐng)使用errors.As
var tt *json.SyntaxError
if errors.As(err, &tt) {
log.Printf("Syntax Error: %v", tt)
} else if err != nil {
log.Fatalf("Fatal: %#v", err)
}
https://go.dev/play/p/mlqGN2ypwBs
您可以檢查Offset
公共領(lǐng)域。但是要比較非公共msg
領(lǐng)域,您需要使用err.Error()
- 但這可能很脆弱,因?yàn)榇朕o可能會(huì)隨著時(shí)間而改變。
注意: errors.Is不能在這里使用,因?yàn)樗粶y(cè)試錯(cuò)誤相等性:直接;或通過(guò)error.Unwrap -ing。
由于這里的 json.SyntaxError沒(méi)有被包裝——也不是一個(gè)哨兵錯(cuò)誤——它不能通過(guò)匹配errors.Is
。
- 1 回答
- 0 關(guān)注
- 161 瀏覽
添加回答
舉報(bào)
0/150
提交
取消