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

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

區(qū)分帶恢復(fù)的死機(jī)和未發(fā)生錯(cuò)誤

區(qū)分帶恢復(fù)的死機(jī)和未發(fā)生錯(cuò)誤

Go
白板的微信 2022-09-12 21:17:57
我有以下代碼:package mainimport (    "fmt")func recoverFoo() {    if r := recover(); r != nil {        println("Recovered")    }}func foo() (int, error) {    defer recoverFoo()    panic("shit!")}func main() {    x, err := foo()    println("after foo x = " + fmt.Sprint(x))    if err != nil {        println("An error occured")    } else {        println("No error occured")    }}在這種情況下,我調(diào)用 foo(實(shí)際上我的函數(shù) foo 正在調(diào)用第三方庫,該庫有時(shí)會(huì)引起恐慌,但有時(shí)還會(huì)返回錯(cuò)誤)。如果它恐慌,我不能讓它崩潰應(yīng)用程序,但我需要知道出了什么問題,因?yàn)槲冶仨氬e(cuò)誤地寫入本地存儲(chǔ)。在這種情況下,從 Foo 返回的值可以具有 0 的有效值。因此,恢復(fù)設(shè)置x和err為默認(rèn)值(0和nil)不會(huì)告訴我是否確實(shí)發(fā)生了錯(cuò)誤...x我看到兩種可能的解決方案,(1)我將err和x包裝成自定義返回類型,并假設(shè)如果它為nil,則會(huì)發(fā)生錯(cuò)誤。(2)我有第三個(gè)返回布爾值,指定沒有發(fā)生恐慌(它將默認(rèn)為false)他們是我在這里錯(cuò)過的東西嗎,圍繞著去錯(cuò)誤處理和從恐慌中恢復(fù)過來。我是新來的,所以想要一些建議。
查看完整描述

1 回答

?
拉風(fēng)的咖菲貓

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

由于 panic 和 “軟” 錯(cuò)誤都是程序異常,因此應(yīng)保留非 nil 錯(cuò)誤語義。可以將錯(cuò)誤包裝在自定義類型或簡(jiǎn)單的 error 變量中,并在函數(shù)調(diào)用后進(jìn)行檢查。

此外,為了實(shí)際修改返回的錯(cuò)誤,您還應(yīng)該:

  • 在延遲函數(shù)文本中使用recover()

  • 使用命名的返回參數(shù)

從規(guī)范延遲聲明

例如,如果延遲函數(shù)是函數(shù)文本,并且周圍的函數(shù)已命名了文本范圍內(nèi)的結(jié)果參數(shù),則延遲函數(shù)可以在返回結(jié)果參數(shù)之前訪問和修改結(jié)果參數(shù)

package main


import (

    "errors"

    "fmt"

    "log"

)


var ErrPanicRecovered = errors.New("recovered from panic")


// named return parameters

func recoverableFoo() (i int, err error) {

    defer func() {

        if r := recover(); r != nil {

            err = fmt.Errorf("%w: %v", ErrPanicRecovered, r)

        }

    }()

    // panic("problem!") // or any call that may panic; uncomment to test

    return 1, nil

}



func main() {

    x, err := foo()

    if err != nil {

        if errors.Is(err, ErrPanicRecovered) {

            log.Fatal("panicked: ", err)

        }

        log.Printf("some other error: %s", err.Error())

        return

    }


    fmt.Println("after foo x = " + fmt.Sprint(x))

}

特別是,使用fmt。帶有格式設(shè)置謂詞的 Errorf 允許您正確包裝錯(cuò)誤,并在以后檢查錯(cuò)誤。是:%w


如果格式說明符包含帶有錯(cuò)誤操作數(shù)的謂詞,則返回的錯(cuò)誤將實(shí)現(xiàn)返回操作數(shù)的 Unwrap 方法。%w


游樂場(chǎng): https://play.golang.org/p/p-JI1B0cw3x


查看完整回答
反對(duì) 回復(fù) 2022-09-12
  • 1 回答
  • 0 關(guān)注
  • 89 瀏覽

添加回答

舉報(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)