Go-তে Custom Errors তৈরি করা
Go প্রোগ্রামিং ভাষায় errors ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ, কারণ এটি প্রোগ্রামিংয়ের স্থিতিশীলতা এবং কার্যকারিতা নিশ্চিত করে। Go তে বিল্ট-ইন error টাইপ আছে, যা সাধারণত একটি string ডেটা টাইপের সাথে যুক্ত থাকে এবং প্রোগ্রামের ত্রুটি বা সমস্যা নির্দেশ করে। তবে, আপনি চাইলে আপনার নিজের custom errors তৈরি করতে পারেন, যা আপনাকে নির্দিষ্ট ত্রুটির তথ্য বহন করতে সহায়তা করবে।
Go তে custom errors তৈরি করতে, সাধারণত একটি নতুন টাইপ (যেমন struct) তৈরি করা হয় এবং তাতে Error() মেথড যুক্ত করা হয়, যাতে এটি error interface সম্পূর্ণ করতে পারে। এর মাধ্যমে আপনি আরও বিস্তারিত ত্রুটি বার্তা দিতে পারেন।
১. Custom Error Types তৈরি করা
Go তে custom error তৈরি করতে, সাধারণত একটি struct তৈরি করা হয় এবং এতে Error() মেথড যুক্ত করা হয়, যা error interface-এ থাকার জন্য প্রয়োজনীয় ফাংশন।
১.১ Custom Error Definition
package main
import (
"fmt"
)
// Custom error type ডিফাইন করা
type MyError struct {
Code int
Message string
}
// Error() method যোগ করা
func (e *MyError) Error() string {
return fmt.Sprintf("Error Code: %d, Message: %s", e.Code, e.Message)
}
func main() {
// Custom error তৈরি
err := &MyError{
Code: 404,
Message: "Resource not found",
}
// Error প্রিন্ট করা
fmt.Println(err) // আউটপুট: Error Code: 404, Message: Resource not found
}এখানে, MyError struct তৈরি করা হয়েছে যা Code এবং Message ধারণ করে। Error() মেথডটি error interface-এ থাকার জন্য এটি প্রয়োজনীয় ফাংশন হিসাবে কাজ করে এবং কাস্টম ত্রুটির বার্তা প্রদান করে।
২. Custom Error এর সাথে Context যোগ করা
এটি আরও কার্যকরী করার জন্য, আপনি context যোগ করতে পারেন। এর মাধ্যমে আপনি ত্রুটির সাথে অতিরিক্ত তথ্য যেমন ফাইলের নাম, লাইনের নাম্বার ইত্যাদি সংযুক্ত করতে পারেন।
২.১ Custom Error with Context
package main
import (
"fmt"
)
// Custom error type with context
type MyError struct {
File string
Line int
Message string
}
// Error() method
func (e *MyError) Error() string {
return fmt.Sprintf("Error in file %s at line %d: %s", e.File, e.Line, e.Message)
}
func main() {
// Custom error with additional context
err := &MyError{
File: "main.go",
Line: 42,
Message: "Unable to open file",
}
// Error message with context
fmt.Println(err) // আউটপুট: Error in file main.go at line 42: Unable to open file
}এখানে, MyError struct এর মধ্যে File এবং Line যোগ করা হয়েছে, যা ত্রুটির সঠিক স্থান (context) জানাতে সহায়তা করে।
৩. Error Wrapping (এরর র্যাপিং)
Go 1.13 থেকে error wrapping ফিচার এসেছে, যার মাধ্যমে আপনি একটি ত্রুটির সাথে আরেকটি ত্রুটি যোগ করতে পারেন। এতে আগের ত্রুটির বিস্তারিত সংরক্ষিত থাকে এবং আপনি নতুন ত্রুটি দিতে পারেন।
৩.১ Error Wrapping Example
package main
import (
"fmt"
"errors"
)
// Custom error type
type MyError struct {
Code int
Message string
}
// Error() method
func (e *MyError) Error() string {
return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)
}
func main() {
// Initial error
err := &MyError{Code: 400, Message: "Bad Request"}
// Wrapping another error
wrappedError := fmt.Errorf("An error occurred: %w", err)
// Printing wrapped error
fmt.Println(wrappedError)
}এখানে, fmt.Errorf ব্যবহার করে একটি নতুন ত্রুটি তৈরি করা হয়েছে এবং আগের MyError ত্রুটির সাথে wrap করা হয়েছে। "%w" স্ট্রিং ফরম্যাট ব্যবহার করে ত্রুটির সাথে অন্য একটি ত্রুটি যুক্ত করা যায়।
আউটপুট:
An error occurred: Code: 400, Message: Bad Requestএটি wrappedError ত্রুটির মধ্যে আগের ত্রুটির সমস্ত তথ্য সংরক্ষণ করবে, যাতে আপনি সেই ত্রুটির বিশদ জানতে পারেন।
৪. Custom Error Handling এবং Type Assertion
আপনি যখন custom error তৈরি করেন, তখন type assertion ব্যবহার করে সেই error টাইপ চেক করতে পারেন এবং ত্রুটির আরও বিস্তারিত তথ্য পেতে পারেন।
৪.১ Type Assertion with Custom Error
package main
import (
"fmt"
)
// Custom error type
type MyError struct {
Code int
Message string
}
// Error() method
func (e *MyError) Error() string {
return fmt.Sprintf("Code: %d, Message: %s", e.Code, e.Message)
}
func processRequest() error {
return &MyError{Code: 404, Message: "Resource not found"}
}
func main() {
err := processRequest()
// Type assertion to check custom error
if myErr, ok := err.(*MyError); ok {
fmt.Println("Custom error occurred:")
fmt.Println("Code:", myErr.Code)
fmt.Println("Message:", myErr.Message)
} else {
fmt.Println("An error occurred:", err)
}
}এখানে, processRequest ফাংশন একটি custom error ফেরত দেয়, এবং আমরা type assertion ব্যবহার করে ত্রুটির ধরন চেক করছি। যদি এটি *MyError টাইপ হয়, তাহলে আমরা এর মান দেখতে পারি।
আউটপুট:
Custom error occurred:
Code: 404
Message: Resource not foundসারসংক্ষেপ
- Custom Errors: Go তে custom errors তৈরি করতে আপনি একটি struct তৈরি করেন এবং তাতে
Error()মেথড যোগ করেন। - Error Wrapping: Go 1.13 থেকে error wrapping ফিচার পাওয়া যায়, যার মাধ্যমে আপনি ত্রুটির মধ্যে আরেকটি ত্রুটি সংযুক্ত করতে পারেন।
- Type Assertion: custom errors ব্যবহারের ক্ষেত্রে,
type assertionব্যবহার করে আপনি ত্রুটির বিস্তারিত তথ্য অ্যাক্সেস করতে পারেন।
Custom errors তৈরি করার মাধ্যমে আপনি আপনার Go প্রোগ্রামে ত্রুটি হ্যান্ডলিং আরও উন্নত করতে পারেন, যার মাধ্যমে ত্রুটির উৎস এবং প্রসঙ্গ ভালোভাবে ট্র্যাক করা সম্ভব হয়।