2014-07-17 6 views
58

log.Fatal ile Golang programımda hata atmaya çalışıyordum, ancak log.Fatal, log.Fatal'un çalıştırıldığı satırı da yazdırmıyor. Log.Fatal adlı satır numarasına erişmenin bir yolu yok mu? bir hata atarken satır numarasını almanın bir yolu var mı?Az önce aradığı hatanın satır numarasını yazdırmak için Golang programını nasıl edinirsiniz?

Bunu Google'a denemeye çalışıyordum ama nasıl emin olamadım. Alabildiğim en iyi şey, iyi olduğunu düşündüğüm printing the stack trace idi, ama biraz fazla olabilir. Ayrıca, her bir hat numarasına ihtiyaç duyduğumda debug.PrintStack() yazmak istemiyorum, bunun için log.FatalStackTrace() ya da kostüm olmayan bir şey var.

Ayrıca, kendi hata ayıklama/hata işleme araçlarını yapmak istemememin sebebi, insanların özel kostüm işleme kodumu nasıl kullanacaklarını öğrenmek istemediğidir. Sadece insanların kodumu sonra okumak ve daha az insanlar benim kod hakkında daha iyi :)

+0

http://golang.org/src/pkg/log/log.go?s=4418:4472# bkz içerecek bir özel Kaydedici veya varsayılan ya üzerinde Flags ayarlayabilirsiniz L120 – chendesheng

+0

Hat numaralarını yazdırdığınız an, bu, kodunuza girmem gerekeceği anlamına geliyor, bu yüzden "Daha az insan benim kodum hakkında daha iyi bilgi sahibi olmak zorunda." Yapmanız gereken açık ve özlü hatalar var. – Wessie

cevap

69

Sen Llongfile or Lshortfile

// to change the flags on the default logger 
log.SetFlags(log.LstdFlags | log.Lshortfile) 
+0

Yani, bunun çalışması için sadece paket dosyalarının en üstünde bunu ayarlamam gerekiyor ve bu paket için tüm dosyalarım kullanabiliyor muyum? – Pinocchio

+3

Evet, özel bir günlüğü kullanıyorsanız, 'var mylog = log.New (os.Stderr, "app:", log.LstdFlags | log.Lshortfile) 'gibi kullanabilirsiniz. – OneOfOne

+0

Gerçekten bir değişken oluşturmak zorunda mıyım? Ben go.SetFlags (log.LstdFlags | log.Lshortfile) go go dosyamın üstündeki sadece yapamam? Bir hata alıyorum: "beklenen bildirimi," INDENT "log' log.SetFlags (log.LstdFlags | log.Lshortfile) 'yapmaya çalıştığımda bulundu. Sadece bunun için bir değişken oluşturmak zorunda kalmamı sinirlendiriyor, neden bir "log.Fatal" ("string", log.Flag) 'olabilir). Ancak yeni bir değişken günlüğü oluşturuldu. Günlük değişkenleri ve şeyler oluşturmak için standart bir şey mi? – Pinocchio

51

Kısa versiyonunu öğrenmek zorunda

"ah ok, so its throwing an error and doing X..."

gibi olabilir bir şey standardını istiyorum, doğrudan inşa şey yok , kullandığınız az bir öğrenme eğrisi ile bunu uygulayabilirsiniz ancak runtime.Caller

func HandleError(err error) (b bool) { 
    if err != nil { 
     // notice that we're using 1, so it will actually log where 
     // the error happened, 0 = this function, we don't want that. 
     _, fn, line, _ := runtime.Caller(1) 
     log.Printf("[error] %s:%d %v", fn, line, err) 
     b = true 
    } 
    return 
} 

//this logs the function name as well. 
func FancyHandleError(err error) (b bool) { 
    if err != nil { 
     // notice that we're using 1, so it will actually log the where 
     // the error happened, 0 = this function, we don't want that. 
     pc, fn, line, _ := runtime.Caller(1) 

     log.Printf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err) 
     b = true 
    } 
    return 
} 

func main() { 
    if FancyHandleError(fmt.Errorf("it's the end of the world")) { 
     log.Print("stuff") 
    } 
} 

playground

+2

Zaten verilen cevap sorunu düzgün bir şekilde düzeltirken, çözümünüz beni harika bir şeyin - çalışma zamanı paketinin - varlığı konusunda uyardı! Güzel şeyler :) https://golang.org/pkg/runtime/ –

İlgili konular