Go-তে error Interface এর ব্যবহার
Go প্রোগ্রামিং ভাষায়, error একটি বিল্ট-ইন interface, যা error handling সিস্টেমের অংশ। এই error interface দিয়ে, আপনি যে কোনো custom error তৈরি করতে পারেন যা আপনার কোডের মধ্যে নির্দিষ্ট ত্রুটি বা সমস্যাগুলি উপস্থাপন করে। Go তে ত্রুটির (error) ব্যবস্থাপনা সাধারণত error interface এর মাধ্যমে করা হয়, এবং এর সাহায্যে আপনার কোডকে আরও নির্ভুল এবং পরিষ্কারভাবে পরিচালনা করা যায়।
১. Go-তে error Interface কি?
Go-তে error একটি predefined interface, যার মধ্যে শুধুমাত্র একটি method থাকে:
type error interface {
Error() string
}Error(): এটি একটি method যা একটি string ফেরত দেয় এবং ত্রুটির বার্তা প্রদর্শন করে। এই method কে বাস্তবায়ন করে, আপনি কাস্টম error তৈরি করতে পারেন।
Go তে সাধারণত error interface ব্যবহার করে একটি ত্রুটি অবস্থান যাচাই করা হয় এবং প্রয়োজনে সেই error handling করা হয়।
২. Error Interface ব্যবহার
২.১ Built-in Error Handling
Go তে, error handling সাধারণত দুইটি ভ্যালু দিয়ে করা হয়:
- প্রথমটি: কোন function বা operation এর সফল ফলাফল।
- দ্বিতীয়টি: error যদি ঘটে থাকে।
package main
import (
"fmt"
"errors"
)
func divide(a, b int) (int, error) {
if b == 0 {
// error interface ব্যবহার করে error তৈরি করা
return 0, errors.New("division by zero")
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: division by zero
} else {
fmt.Println("Result:", result)
}
}এখানে, divide ফাংশনে আমরা একটি error তৈরি করেছি যখন দ্বিতীয় সংখ্যাটি শূন্য (zero) হয়। আমরা errors.New() ব্যবহার করে একটি কাস্টম error বার্তা তৈরি করেছি, যা error interface পূর্ণ করেছে।
আউটপুট:
Error: division by zero২.২ Error Struct তৈরি করা
Go তে আপনি struct এর মাধ্যমে কাস্টম error তৈরি করতে পারেন এবং সেই struct-এ Error() method দিয়ে error interface বাস্তবায়ন করতে পারেন।
package main
import (
"fmt"
)
// Custom Error Struct
type DivisionError struct {
Dividend, Divisor int
}
func (e DivisionError) Error() string {
return fmt.Sprintf("cannot divide %d by %d", e.Dividend, e.Divisor)
}
func divide(a, b int) (int, error) {
if b == 0 {
// কাস্টম error তৈরি করা
return 0, DivisionError{a, b}
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: cannot divide 10 by 0
} else {
fmt.Println("Result:", result)
}
}এখানে, আমরা একটি DivisionError নামক struct তৈরি করেছি, যা error interface বাস্তবায়ন করেছে এবং Error() method-টির মাধ্যমে error বার্তা প্রদান করছে।
আউটপুট:
Error: cannot divide 10 by 0২.৩ Error Wrapping
Go 1.13 থেকে, fmt.Errorf ফাংশনটি error wrapping-এর সুবিধা দেয়, যার মাধ্যমে আপনি একটি existing error-কে নতুন বার্তা দিয়ে wrap করতে পারেন। এই ফিচারটি আপনাকে ত্রুটি সম্পর্কিত আরও বিস্তারিত তথ্য দিতে সহায়তা করে।
package main
import (
"fmt"
"errors"
)
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("division failed: %w", errors.New("division by zero"))
}
return a / b, nil
}
func main() {
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err) // আউটপুট: Error: division failed: division by zero
} else {
fmt.Println("Result:", result)
}
}এখানে, আমরা fmt.Errorf ব্যবহার করে একটি নতুন error তৈরি করেছি যা পুরানো error-টিকে wrap করে নতুন বার্তা প্রদান করছে।
আউটপুট:
Error: division failed: division by zero৩. Error Handling Practices
Go তে সাধারণত error handling দুটি অংশে বিভক্ত থাকে:
- Error চেকিং: ফাংশন বা অপারেশনে ত্রুটি ঘটে কিনা তা চেক করা।
- Error reporting: ত্রুটি ঘটলে তার তথ্য রিপোর্ট বা লগ করা।
এটি সাধারণত এইভাবে করা হয়:
if err != nil {
// Error handling code here
}৩.১ Multiple error handling
কখনো কখনো, একাধিক error চেকিং করা প্রয়োজন হতে পারে, যেমন ফাইল ওপেন করা এবং রিডিং, নেটওয়ার্ক কানেকশন তৈরি ইত্যাদি। এখানে multiple error handling এর একটি উদাহরণ:
package main
import (
"fmt"
"os"
)
func main() {
// ফাইল ওপেন করা
file, err := os.Open("non_existent_file.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
// ফাইলের মধ্যে কাজ করতে থাকা কোড...
}এখানে, আমরা os.Open ফাংশনে একটি error চেক করছি এবং ত্রুটি ঘটলে সেই error রিপোর্ট করছি।
সারসংক্ষেপ
errorInterface: Go-তেerrorএকটি বিল্ট-ইন interface যা একটিError()method ধারণ করে, যা ত্রুটির বার্তা প্রদান করে।- Custom Errors: Go-তে আপনি struct এর মাধ্যমে কাস্টম error তৈরি করতে পারেন এবং তা
Error()method দিয়েerrorinterface বাস্তবায়ন করতে পারেন। - Error Wrapping:
fmt.Errorfব্যবহার করে error wrapping করা সম্ভব, যা existing error এর সাথে নতুন বার্তা যোগ করতে সহায়তা করে। - Error Handling: Go তে ত্রুটি চেক এবং রিপোর্ট করার জন্য সাধারণত
if err != nilব্যবহার করা হয়।
Go-তে error interface ব্যবহার করে আপনি শক্তিশালী এবং পরিষ্কার error handling সিস্টেম তৈরি করতে পারবেন, যা আপনার কোডের স্টেবিলিটি এবং নির্ভুলতা বাড়ায়।