Go-তে Error Handling মেকানিজম
১. Go-তে Error Handling এর ধারণা
Go প্রোগ্রামিং ভাষায় Error Handling একটি গুরুত্বপূর্ণ অংশ এবং এটি explicit (স্পষ্ট) পদ্ধতির মাধ্যমে পরিচালিত হয়। অন্যান্য ভাষার মতো Go তে exception handling ব্যবহার করা হয় না, বরং error টাইপের মাধ্যমে সমস্যা বা ত্রুটি পরিচালনা করা হয়। Go তে error handling মূলত ফাংশন রিটার্ন ভ্যালু হিসেবে error টাইপের মান ফেরত দেয়, যা ডেভেলপারদের সিদ্ধান্ত নিতে সাহায্য করে যে কোনো অপারেশন সফল হয়েছে বা ব্যর্থ হয়েছে।
১.১ Go Error Handling এর মূল বৈশিষ্ট্য
- Go তে error একটি বিল্ট-ইন ইন্টারফেস টাইপ যা একটি কাস্টম ধরনের ত্রুটির পরিস্থিতি প্রতিনিধিত্ব করতে ব্যবহৃত হয়।
- প্রতিটি ফাংশন যেখানে একটি ত্রুটি ঘটতে পারে, সেখানে error রিটার্ন ভ্যালু প্রদান করতে হবে।
- Go তে ত্রুটির মোকাবিলা করা হয় ফাংশনের রিটার্ন ভ্যালু পরীক্ষা করে।
২. Go তে Error Interface
Go তে error একটি interface যা একটি Error() মেথড ধারণ করে:
type error interface {
Error() string
}এখানে, Error() মেথডটি একটি স্ট্রিং ফেরত দেয় যা ত্রুটির বার্তা ধারণ করে।
৩. Error Handling এর মৌলিক ধারণা
৩.১ Error রিটার্ন করা
Go তে যখন একটি ত্রুটি ঘটে, তখন একটি ফাংশন error টাইপের রিটার্ন মান ফেরত দেয়। উদাহরণস্বরূপ:
package main
import "fmt"
import "errors"
// একটি ফাংশন যা error রিটার্ন করবে
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: cannot divide by zero
} else {
fmt.Println("Result:", result)
}
}এখানে, divide ফাংশনটি যদি b এর মান 0 হয়, তবে এটি একটি error রিটার্ন করবে। main ফাংশনে, আমরা err এর মান পরীক্ষা করি, এবং যদি এটি nil না হয়, তবে ত্রুটি বার্তা প্রিন্ট করা হয়।
আউটপুট:
Error: cannot divide by zero৩.২ Go-তে Error তৈরি করা
Go তে errors.New() ফাংশন দিয়ে একটি নতুন error তৈরি করা যায়। এটি একটি স্ট্রিং আর্গুমেন্ট নেয় এবং তা দিয়ে একটি error অবজেক্ট তৈরি করে।
package main
import "fmt"
import "errors"
func main() {
err := errors.New("Something went wrong!")
fmt.Println(err) // আউটপুট: Something went wrong!
}এখানে, আমরা একটি নতুন error তৈরি করেছি এবং তা প্রিন্ট করেছি।
৪. Error Handling with Multiple Return Values
Go তে, আপনি একাধিক মান রিটার্ন করতে পারেন, একটি মান হতে পারে error টাইপ এবং অন্যটি মূল ডেটা (যেমন: ফলাফল)। সাধারণত error রিটার্ন ভ্যালু সর্বদা দ্বিতীয় ভ্যালু হিসেবে থাকে।
৪.১ Multiple Return Values Example
package main
import "fmt"
import "errors"
// একটি ফাংশন যা দুটি মান রিটার্ন করবে
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("division by zero error")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0) // 0 দিয়ে ভাগ করতে চেষ্টা করা হচ্ছে
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: division by zero error
} else {
fmt.Println("Result:", result)
}
}এখানে, divide ফাংশনটি দুটি রিটার্ন ভ্যালু রিটার্ন করেছে — একটি ফলাফল এবং একটি error। যদি error না থাকে, তবে ফলাফল প্রিন্ট হবে; অন্যথায়, error বার্তা প্রিন্ট হবে।
৫. Custom Error Types
Go তে আপনি নিজের error টাইপ তৈরি করতে পারেন, যা error interface implement করে এবং আপনার error মেসেজে অতিরিক্ত তথ্য যোগ করতে সাহায্য করে।
৫.১ Custom Error Type উদাহরণ
package main
import "fmt"
// Custom error type তৈরি করা
type DivisionError struct {
Message string
}
func (e *DivisionError) Error() string {
return e.Message
}
func divide(a, b int) (int, error) {
if b == 0 {
return 0, &DivisionError{"cannot divide by zero"}
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: cannot divide by zero
} else {
fmt.Println("Result:", result)
}
}এখানে, DivisionError নামক একটি custom error টাইপ তৈরি করা হয়েছে, যা Error() মেথড implement করে এবং এতে একটি কাস্টম মেসেজ রয়েছে। এই error টাইপটি divide ফাংশন দ্বারা রিটার্ন করা হয়েছে।
৬. Error Wrapping (Go 1.13)
Go 1.13 থেকে error wrapping এর ফিচার এসেছে, যেখানে আপনি একটি error কে অন্য একটি error এর মধ্যে লুকিয়ে (wrap) রাখতে পারেন। এর জন্য fmt.Errorf() এবং %w ফর্ম্যাট স্পেসিফায়ার ব্যবহার করা হয়।
৬.১ Error Wrapping উদাহরণ
package main
import (
"fmt"
"errors"
)
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division by zero: %w", errors.New("invalid divisor"))
}
return a / b, nil
}
func main() {
_, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: division by zero: invalid divisor
}
}এখানে, fmt.Errorf() ব্যবহার করে একটি error কে অন্য error এর মধ্যে wrap করা হয়েছে এবং %w ফরম্যাট স্পেসিফায়ার ব্যবহার করা হয়েছে।
সারসংক্ষেপ
- Go-তে Error Handling: Go তে error handling সরাসরি error রিটার্ন ভ্যালু দিয়ে করা হয়। এটি explicit এবং সহজ।
- error Interface: Go তে
errorএকটি interface যাError()মেথড প্রদান করে। - Error Creation:
errors.New()এবং custom error টাইপ তৈরি করে error তৈরি করা যায়। - Multiple Return Values: Go তে error কে সাধারণত দ্বিতীয় রিটার্ন ভ্যালু হিসেবে রিটার্ন করা হয়।
- Error Wrapping: Go 1.13 এর পর
fmt.Errorf()এবং%wফরম্যাট স্পেসিফায়ার ব্যবহার করে error wrapping করা যায়।
Go তে error handling খুবই সোজা এবং শক্তিশালী, যা কোডে ত্রুটি ম্যানেজমেন্টকে সহজ এবং কার্যকর করে তোলে।