2013-07-09 5 views
5

È possibile ottenere il numero di riga su cui è stata restituita una funzione dall'ambito di chiamata?Ottieni il numero di riga su quale funzione è stata restituita

Esempio:

func callee() error { 
    if cond { 
    return errors.New("whoops!") 
    } 
    return nil 
} 

func caller() { 
    // Possible to retrieve the line number of callee return here? 
    callee() 
} 

Suppongo che non è possibile, in quanto dovrebbe essere già rimossa dalla pila, ma forse è ancora nella cache da qualche parte?

Il caso d'uso è che ho un gestore HTTP e vorrei registrare la riga e il nome del file su cui è stato restituito l'errore, senza dover sparpagliare il codice.

risposta

7

AFAIK, non è possibile acquisire automaticamente la riga in cui è stato eseguito l'ultimo reso.

Tuttavia, con un piccolo aiuto si può avere:

package main 

import (
     "fmt" 
     "runtime" 
) 

func here(s string, args ...interface{}) error { 
     _, fname, fline, _ := runtime.Caller(1) 
     h := fmt.Sprintf("%s:%d: ", fname, fline) 
     return fmt.Errorf(h+s, args...) 
} 

func foo(i int) error { 
     if i == 2 { 
       return here("cannot handle %d", i) // line 16 
     } 

     if i%3 == 0 { 
       return here("also cannot handle %d", i) // line 20 
     } 

     return nil 
} 

func main() { 
     fmt.Println(foo(2)) 
     fmt.Println(foo(3)) 
     fmt.Println(foo(4)) 
} 

Playground


uscita:

/tmpfs/gosandbox-92c2a0f2_32bdf9d9_3c7d2a0a_80ba8510_f68d9721/prog.go:16: cannot handle 2 
/tmpfs/gosandbox-92c2a0f2_32bdf9d9_3c7d2a0a_80ba8510_f68d9721/prog.go:20: also cannot handle 3 
<nil> 
+1

+1 ho appena scritto un codice simile e stavo per postare era una risposta, solo per vedere che non c'era più alcun bisogno. –

+0

Sì, ho già considerato l'opzione della funzione di avvolgimento. Lo userà allora, se non sembra esserci un'alternativa migliore. –

Problemi correlati