2014-09-03 43 views
5

Panik durumdan nasıl kurtulacağımı anlamaya çalışıyorum. Normalde, bunun gibi bir şey: o kadar çok anlayabiliyorum:golang getiri geri dönüş değeri sözdizimini düzeltme

if r := recover(); r != nil { 
    fmt.Println("Recovered in f", r) 
} 

Ama kod snippet'ini aşağıdaki gibi gördüm:

. (Hata) parçası ne yapıyor?

cevap

11

error recovered belirli bir türde olup olmadığını kontrol eden bir type assertion'dur.

Bu tür onaylama işlemi başarısız olur; bu, yığının hiçbir şeyin kesintiye uğramış gibi çözülmesini sürdüren bir çalışma zamanı hatasına neden olur.

Bu, yerel bir MyError tipi hata için tanımladığınızda ve yalnızca bu türden kurtarmak istediğinizde kullanışlıdır.

Bir tür iddianın bir net.Error test ve ardından kalıcı olanlardan geçici ağ hataları ayırt edebilirsiniz "Error handling and Go"

Müşteri kodundaki bir örnek görebilirsiniz. Örneğin

, bir web tarayıcısı olabilir:

  • uyku ve bunun geçici bir hatayı
  • karşılaşır ve aksi vazgeçmek ne zaman yeniden deneyin.
if nerr, ok := err.(net.Error); ok && nerr.Temporary() { 
    time.Sleep(1e9) 
    continue 
} 
if err != nil { 
    log.Fatal(err) 
} 

Eğer kurtarmak istediğiniz hata birkaç türleri varsa, bir tür anahtarını kullanabilirsiniz "Golang: returning from defer"

defer func() { 
    if r := recover(); r != nil { 
     fmt.Println("Recovered in f", r) 
     // find out exactly what the error was and set err 
     switch x := r.(type) { 
     case string: 
      err = errors.New(x) 
     case error: 
      err = x 
     default: 
      err = errors.New("Unknown panic") 
     } 
     // invalidate rep 
     rep = nil 
     // return the modified err and rep 
    } 
}() 
içindedir