Go में मानक त्रुटि आउटपुट पर रीडायरेक्ट करते समय

7 min

language: ja bn en es hi pt ru zh-cn zh-tw

नमस्ते, मैं अक्षम हूँ।
मुझे इस हिस्से में Go के लिए बहुत अधिक स्पष्टीकरण नहीं मिला, इसलिए मैं इसे लिख रहा हूँ।

रिटर्न वैल्यू की जाँच करें

जब आपके पास शुरू में ऐसा कोड था।

func main() {
  if len(os.Args) < 2 {
    fmt.Println("Usage: go run main.go https://soulminingrig.com/")
    return
  }

  url := os.Args[1]
  title, err := fetchTitle(url)
  if err != nil {
    fmt.Printf( "Error: %v\n", err)
    return
  }

  fmt.Printf("Title: %s\n", title)
}

बेशक, उपरोक्त में भी, Go में त्रुटियाँ त्रुटियों के रूप में आउटपुट होती हैं, लेकिन यदि आप बिल्ड के बाद निष्पादन योग्य बाइनरी की त्रुटि रिटर्न वैल्यू प्राप्त करना चाहते हैं तो क्या होगा?

alleycat:[haturatu]:~/git/go-title$ ./go-title 
Usage: go run main.go https://soulminingrig.com/
alleycat:[haturatu]:~/git/go-title$ echo $?
0
alleycat:[haturatu]:~/git/go-title$ ./go-title http://https://soulminingrig.nodomain/
Error: failed to fetch URL: Get "http://https//soulminingrig.nodomain/": dial tcp: lookup https: no such host
alleycat:[haturatu]:~/git/go-title$ echo $?
0

सब कुछ मानक आउटपुट के रूप में माना जाता है।

os.Exit के साथ रिटर्न वैल्यू निर्दिष्ट करें

इसलिए, इसे ठीक से त्रुटि के रूप में मानने के लिए os.Exit के साथ निर्दिष्ट करना आवश्यक है, इसलिए इसे इस प्रकार ठीक करें।

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: go run main.go https://soulminingrig.com/")
		os.Exit(1)
	}

	url := os.Args[1]
	title, err := fetchTitle(url)
	if err != nil {
		fmt.Printf( "Error: %v\n", err)
		os.Exit(2)
	}

	fmt.Printf("Title: %s\n", title)
}

अब इसे फिर से बनाएं और चलाएं।

alleycat:[haturatu]:~/git/go-title$ ./go-title 
Usage: go run main.go https://soulminingrig.com/
alleycat:[haturatu]:~/git/go-title$ echo $?
1
alleycat:[haturatu]:~/git/go-title$ ./go-title http://https://soulminingrig.nodomain/
Error: failed to fetch URL: Get "http://https//soulminingrig.nodomain/": dial tcp: lookup https: no such host
alleycat:[haturatu]:~/git/go-title$ echo $?
2

रिटर्न वैल्यू सही ढंग से वापस आ गई।

रिटर्न वैल्यू 0 के साथ सफल पैटर्न को /dev/null में फेंकने का प्रयास करें

आप > /dev/null का उपयोग करके केवल मानक आउटपुट की रिटर्न वैल्यू 0 को छोड़ सकते हैं, तो आइए इसे आज़माएं।

alleycat:[haturatu]:~/git/go-title$ ./go-title > /dev/null
alleycat:[haturatu]:~/git/go-title$ ./go-title http://https://soulminingrig.nodomain/ > /dev/null

इस मामले में, fmt.Println मानक आउटपुट से संबंधित है, इसलिए त्रुटि संदेशों की पुष्टि नहीं की जा सकती है।
अधिकांश सही GNU Tools और अन्य निष्पादन योग्य बाइनरी के लिए, त्रुटि संदेशों को मानक आउटपुट पर प्रिंट करना सामान्य नहीं है, इसलिए त्रुटि संदेशों को भी त्रुटि आउटपुट पर प्रिंट किया जाना चाहिए।
आधिकारिक दस्तावेज़ों में भी, केवल fmt.Print के साथ आउटपुट किया जाता है।
त्रुटि लौटाएँ और संभालें
https://pkg.go.dev/errors
Go की दुनिया में मॉड्यूल बनाते समय मानक त्रुटि आउटपुट का उपयोग करने की कोई विशेष आवश्यकता नहीं है, लेकिन यह उस आवश्यकता को पूरा नहीं करता है जब आप डीबग करते समय केवल > /dev/null के साथ त्रुटि आउटपुट देखना चाहते हैं।
अंततः, इसे C भाषा की तरह fprintf के साथ संभालना आवश्यक है।
अब, आइए fprintf के पहले तर्क के रूप में मानक त्रुटि आउटपुट के रूप में os.Stderr दें।

fmt.Print और fmt.Fprint के बीच अंतर

आइए इसे इस प्रकार बदलें।
यह लेख बहुत स्पष्ट है।
Go के fmt.Print-संबंधित फ़ंक्शंस का बुद्धिमानी से उपयोग करें
यदि यह लेख भी आपको 'यह क्या है!' जैसा महसूस कराता है, तो आपको C भाषा में print-संबंधित आउटपुट के बीच के अंतरों की जाँच करके कुछ संतोषजनक मिल सकता है।
यदि आप printf का अर्थ नहीं समझते हैं, तो आप इसे awk के साथ भी आज़मा सकते हैं।

$ ls -la | awk '{print $9}'
$ ls -la | awk '{printf $9}'

awk में fprint...। ज्ञान की कमी के कारण मुझे नहीं पता...।
यदि कोई जानता है तो कृपया मुझे बताएं।

func main() {
	if len(os.Args) < 2 {
		fmt.Fprintln(os.Stderr, "Usage: go run main.go https://soulminingrig.com/")
		os.Exit(1)
	}

	url := os.Args[1]
	title, err := fetchTitle(url)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", err)
		os.Exit(2)
	}

	fmt.Printf("Title: %s\n", title)
}

आइए अब परिणाम देखें।

alleycat:[haturatu]:~/git/go-title$ ./go-title > /dev/null
Usage: go run main.go https://soulminingrig.com/
alleycat:[haturatu]:~/git/go-title$ echo $?
1
alleycat:[haturatu]:~/git/go-title$ ./go-title http://https://soulminingrig.nodomain/ > /dev/null
Error: failed to fetch URL: Get "http://https//soulminingrig.nodomain/": dial tcp: lookup https: no such host
alleycat:[haturatu]:~/git/go-title$ echo $?
2

त्रुटि आउटपुट सही ढंग से किया गया था।

मुझे वास्तव में लगा कि इस तरह के हैंडलिंग को भूलना बहुत आसान है, इसलिए मुझे विशेष रूप से सही त्रुटि आउटपुट के साथ सावधानी बरतनी चाहिए।

Related Posts