मैंने अब तक log.Fatal
का उपयोग टाला है, लेकिन मैंने हाल ही में इन प्रश्नों को सह-खोजा है; code-coverage और tests-using-log-fatal।क्या एक गो पैकेज कभी लॉग का उपयोग करना चाहिए। घातक और कब?
100 कोड कवरेज सवालों से टिप्पणी में से एक का कहना है: ...
मामलों
log.Fatal
के विशाल बहुमत में केवल मुख्य, या init कार्यों में इस्तेमाल किया जा किया जाना चाहिए (या शायद कुछ बातें करने के लिए होती उन लोगों से केवल सीधे बुलाया जाना) "
यह मुझे सोच जाना है, इसलिए मैं जाओ के साथ प्रदान की मानक पुस्तकालय कोड को देखने के लिए शुरू कर दिया। वहाँ उदाहरण के बहुत सारे जहां पुस्तकालय में परीक्षण कोड का उपयोग करता है कर रहे हैं log.Fatal
जो ठीक लगता है। वहाँ हैं ,
// net/http/transport.go
func (t *Transport) putIdleConn(pconn *persistConn) bool {
...
for _, exist := range t.idleConn[key] {
if exist == pconn {
log.Fatalf("dup idle pconn %p in freelist", pconn)
}
}
...
}
अपने सबसे अच्छा अभ्यास log.Fatal
के उपयोग से बचने के लिए है, तो क्यों है यह मानक पुस्तकालयों में बिल्कुल भी इस्तेमाल किया, मैं अपेक्षा की होगी: इस तरह के net/http
में के रूप में परीक्षण कोड, के बाहर कुछ उदाहरण हैं, नीचे दिखाया गया है बस एक त्रुटि वापस करें। यह लाइब्रेरी के उपयोगकर्ता को os.Exit
कहने के लिए अनुचित लगता है और एप्लिकेशन को साफ-सफाई के लिए कोई मौका नहीं प्रदान करता है।
मैं निष्पक्ष हो सकता हूं, इसलिए मेरा प्रश्न बेहतर अभ्यास के रूप में log.Panic
पर कॉल करना प्रतीत होता है जिसे पुनर्प्राप्त किया जा सकता है और मेरे सैद्धांतिक लंबे चलने वाले स्थिर अनुप्रयोग को राख से बढ़ने का मौका मिल सकता है।
तो लॉग के समय के बारे में गो के लिए सबसे अच्छा अभ्यास क्या होगा। घातक का उपयोग किया जाना चाहिए?
मेरी आशा यह होगी कि यह कोड बिल्कुल पहुंच योग्य नहीं है। यह एक त्रुटि है जो एक निष्क्रिय कनेक्शन को निष्क्रिय सूची में अभी भी होने का कारण बनती है जबकि एक सक्रिय कनेक्शन के रूप में भी प्रयोग किया जा रहा है, ऐसा कुछ नहीं होना चाहिए जो कभी भी होना चाहिए, और इसके लिए होने वाला कुछ विनाशकारी होना चाहिए। लेकिन चूंकि वे निष्क्रिय सूची के आस-पास ठीक से म्यूटेक्स का उपयोग कर रहे हैं और मुझे पता नहीं है कि यह लूप और कोड भी आवश्यक क्यों होगा। क्यों वे पैनसिंग के बजाए तुरंत आपके कार्यक्रम से बाहर निकलेंगे एक और रहस्य है। महान सवाल – captncraig
क्या उस पैकेज में कोई भी परीक्षण उस लाइन तक पहुंचने में सक्षम है? – captncraig
अच्छा सवाल, थोड़ा सा देखो और कुछ भी नहीं देख सकता जो कि विशेष रूप से उस रेखा तक पहुंचने के लिए डिज़ाइन किया गया है। अभी तक निर्णायक नहीं है ... – miltonb