第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

快速查找文件和行號(hào)在 Go 中拋出錯(cuò)誤的技巧?

快速查找文件和行號(hào)在 Go 中拋出錯(cuò)誤的技巧?

Go
天涯盡頭無女友 2021-12-20 10:17:34
在我與 go 的旅程中發(fā)現(xiàn)沒有堆棧跟蹤。所以每當(dāng)出現(xiàn)問題時(shí),我們都會(huì)收到一條簡單的字符串錯(cuò)誤消息,而沒有任何信息來自哪里。這與我習(xí)慣于查看詳細(xì)堆棧跟蹤的其他語言形成鮮明對(duì)比例如,下面是來自apex的錯(cuò)誤消息$ cat event.json | apex invoke --logs webhook                                      ? error parsing response: json: cannot unmarshal array into Go value of type map[string]interface {}這里它告訴我解組到地圖不起作用,因?yàn)樗黣vent.json是一個(gè)數(shù)組。我們已經(jīng)解組到interface{}支持?jǐn)?shù)組和映射。但是,它沒有告訴我哪個(gè)文件/行導(dǎo)致了這個(gè)錯(cuò)誤。問題:有什么方法可以快速找到此錯(cuò)誤來自哪個(gè)文件/行?一般來說,地鼠是否有提示/技巧可以從這個(gè)字符串錯(cuò)誤消息中快速找到問題的根源?這是大多數(shù) go 項(xiàng)目的堆棧跟蹤方式,還是應(yīng)該遵循任何最佳實(shí)踐?
查看完整描述

3 回答

?
GCT1015

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊

有什么方法可以快速找到此錯(cuò)誤來自哪個(gè)文件/行?


除非是無法恢復(fù)的恐慌,否則不會(huì)打印默認(rèn)堆棧。


一般來說,地鼠是否有提示/技巧可以從這個(gè)字符串錯(cuò)誤消息中快速找到問題的根源?這是大多數(shù) go 項(xiàng)目的堆棧跟蹤方式,還是應(yīng)該遵循任何最佳實(shí)踐?


通常,您需要檢查大多數(shù)函數(shù)調(diào)用的錯(cuò)誤返回。有不止一種方法可以做到這一點(diǎn)。我通常使用標(biāo)準(zhǔn)庫包log打印帶有文件和行號(hào)的錯(cuò)誤日志,以便在簡單程序中進(jìn)行調(diào)試。例如:


package main


import "log"

import "errors"


func init() { log.SetFlags(log.Lshortfile | log.LstdFlags) }


func callFunc() error {

    return errors.New("error")

}


func main() {

    if err := callFunc(); err != nil {

        log.Println(err)

    }

}

http://play.golang.org/p/0iytNw7eZ7


輸出:


2009/11/10 23:00:00 main.go:14: error

此外,還有一些功能可以打印或檢索標(biāo)準(zhǔn)庫中的當(dāng)前堆棧runtime/debug,例如https://golang.org/pkg/runtime/debug/#PrintStack


有許多社區(qū)努力使錯(cuò)誤處理更容易,您可以在 GoDoc 中搜索錯(cuò)誤:https ://godoc.org/ ? q = error


查看完整回答
反對(duì) 回復(fù) 2021-12-20
?
ABOUTYOU

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

您嘗試的解決方案查找產(chǎn)生錯(cuò)誤的代碼段以修復(fù)代碼。

您的實(shí)際問題的內(nèi)容event.json。

這稱為XY 問題


Invoke 需要一個(gè) json 對(duì)象,您正在傳遞一個(gè) json 數(shù)組。解決這個(gè)問題,你的問題就消失了!

$ echo -n '{ "value": "Tobi the ferret" }' | apex invoke uppercase

文檔的相關(guān)部分:調(diào)用函數(shù)

這就是產(chǎn)生錯(cuò)誤的代碼:Github


是的,Go 確實(shí)有堆棧跟蹤!閱讀Dave Cheneys 關(guān)于錯(cuò)誤和異常的博文。


查看完整回答
反對(duì) 回復(fù) 2021-12-20
?
慕田峪4524236

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊

當(dāng) a發(fā)生時(shí),Go確實(shí)會(huì)產(chǎn)生堆棧跟蹤panic,從而使程序崩潰。如果代碼panic()直接調(diào)用就會(huì)發(fā)生這種情況,通常在以下情況下:


if err != nil {

    panic("it broke")

}

或者,當(dāng)發(fā)生運(yùn)行時(shí)錯(cuò)誤時(shí):


a := []int{1, 2, 3}

b := a[12] // index out of range

這是一個(gè)最小的例子:


package main


func main() {

    panic("wtf?!")

}

輸出:


panic: wtf?!


goroutine 1 [running]:

panic(0x94e60, 0x1030a040)

    /usr/local/go/src/runtime/panic.go:464 +0x700

main.main()

    /tmp/sandbox366642315/main.go:4 +0x80

注意main.go:4指示文件名和行號(hào)。


在您的示例中,程序沒有恐慌,而是選擇調(diào)用(我猜)os.Exit(1)或log.Fatal("error message")(調(diào)用os.Exit(1))?;蛘?,恐慌只是從調(diào)用函數(shù)中恢復(fù)。不幸的是,如果您不是代碼的作者,則對(duì)此無能為力。



查看完整回答
反對(duì) 回復(fù) 2021-12-20
  • 3 回答
  • 0 關(guān)注
  • 207 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)