2014-09-03 17 views
5

Sto cercando di capire come recuperare dalla situazione di panico. Normalmente, qualcosa del genere farà:golang recupera il valore restituito sintassi

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

Posso capirli molto. Ma ho visto lo snippet di codice come il seguente:

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

Che cosa fa la parte? (Errore)?

risposta

11

È un type assertion che verifica se il error recovered è di un certo tipo.

L'asserzione di tipo non riesce, causa un errore di runtime che continua a srotolare lo stack come se nulla lo avesse interrotto.

Ciò è utile quando si definisce un tipo locale MyError per errore e si desidera recuperare solo da quel tipo.

Si può vedere un esempio nel codice client "Error handling and Go"

può verificare un net.Error con un tipo di affermazione e poi distinguere errori di rete temporanei da quelli permanenti.

Per esempio, un web crawler potrebbe:

  • sonno e riprovare quando incontra un errore temporaneo
  • e rinunciare altrimenti.
if nerr, ok := err.(net.Error); ok && nerr.Temporary() { 
    time.Sleep(1e9) 
    continue 
} 
if err != nil { 
    log.Fatal(err) 
} 

Se si dispone di diversi tipi di errori che si desidera recuperare, è possibile utilizzare un interruttore di tipo è in "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 
    } 
}()