【Go - 異常 / 錯誤值 】

在Go語言中暖侨,異常處理的方式與其他語言(如Java或Python)有所不同剧蚣。Go不使用異常機制,而是采用了錯誤處理模式吗货,即通過返回值來傳遞和處理錯誤泳唠。

以下是Go中處理錯誤的常見方式:

  1. 返回錯誤值:函數返回兩個值,第一個是結果值宙搬,第二個是錯誤值笨腥。如果發(fā)生錯誤,錯誤值將不為nil勇垛。這是Go中最常見的錯誤處理方式扇雕。

    package main
    
    import (
        "errors"
        "fmt"
    )
    
    func doSomething(value int) (int, error) {
        if value < 0 {
            return 0, errors.New("value cannot be negative")
        }
        return value * 2, nil
    }
    
    func main() {
        result, err := doSomething(-1)
        if err != nil {
            fmt.Println("Error:", err)
        } else {
            fmt.Println("Result:", result)
        }
    }
    
    
  2. 自定義錯誤類型:通過實現error接口,定義自己的錯誤類型窥摄。

    package main
    
    import (
        "fmt"
    )
    
    type MyError struct {
        Code    int
        Message string
    }
    
    func (e *MyError) Error() string {
        return fmt.Sprintf("Error %d: %s", e.Code, e.Message)
    }
    
    func doSomething(value int) (int, error) {
        if value < 0 {
            return 0, &MyError{Code: 123, Message: "value cannot be negative"}
        }
        return value * 2, nil
    }
    
    func main() {
        result, err := doSomething(-1)
        if err != nil {
            fmt.Println("Error:", err)
        } else {
            fmt.Println("Result:", result)
        }
    }
    
    
  3. 使用panicrecoverpanic用于在程序遇到嚴重錯誤時終止程序的執(zhí)行镶奉,recover用于捕獲panic,從而恢復正常執(zhí)行崭放。使用panicrecover要謹慎哨苛,因為它們會打破正常的控制流,增加代碼的復雜度币砂。

    package main
    
    import (
        "fmt"
    )
    
    func doSomething(value int) {
        if value < 0 {
            panic("value cannot be negative")
        }
        fmt.Println("Value:", value)
    }
    
    func main() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered from panic:", r)
            }
        }()
        doSomething(-1)
        fmt.Println("This line will not be printed if panic is not recovered")
    }
    
    

在Go中建峭,推薦使用返回錯誤值的方式來處理錯誤,而不是使用panicrecover决摧,因為后者更適用于處理不可恢復的錯誤情境亿蒸。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末凑兰,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子边锁,更是在濱河造成了極大的恐慌姑食,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茅坛,死亡現場離奇詭異音半,居然都是意外死亡,警方通過查閱死者的電腦和手機贡蓖,發(fā)現死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門曹鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斥铺,你說我怎么就攤上這事彻桃。” “怎么了晾蜘?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵叛薯,是天一觀的道長。 經常有香客問我笙纤,道長耗溜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任省容,我火速辦了婚禮抖拴,結果婚禮上,老公的妹妹穿的比我還像新娘腥椒。我一直安慰自己阿宅,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布笼蛛。 她就那樣靜靜地躺著洒放,像睡著了一般。 火紅的嫁衣襯著肌膚如雪滨砍。 梳的紋絲不亂的頭發(fā)上往湿,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音惋戏,去河邊找鬼领追。 笑死,一個胖子當著我的面吹牛响逢,可吹牛的內容都是我干的绒窑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼舔亭,長吁一口氣:“原來是場噩夢啊……” “哼些膨!你這毒婦竟也來了蟀俊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤订雾,失蹤者是張志新(化名)和其女友劉穎肢预,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體葬燎,經...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡误甚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年缚甩,在試婚紗的時候發(fā)現自己被綠了谱净。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡擅威,死狀恐怖壕探,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情郊丛,我是刑警寧澤李请,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厉熟,受9級特大地震影響导盅,放射性物質發(fā)生泄漏。R本人自食惡果不足惜揍瑟,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一白翻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绢片,春花似錦滤馍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至熙涤,卻和暖如春阁苞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祠挫。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工猬错, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓唆阿,卻偏偏與公主長得像获枝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子逢唤,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容