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 দিয়ে আউটপুট করা হয়,
Return and handle an error
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