مدیریت خطای قوی برای برنامه شما در هر شرایطی حیاتی است.
مدیریت خطا یکی از عملیات های مکرر در چرخه توسعه نرم افزار است. این یک جنبه مهم برنامه نویسی خوب است. Go با مکانیزم داخلی خود برای مدیریت خطا، رویکردی ساده و کاربردی دارد. این مبتنی بر بازگرداندن خطاها از توابع و روشها است و شما را قادر میسازد تا روی عملکرد کدی که بصری و خواندنی است تمرکز کنید.
شما خطاها را در Go به صراحت مدیریت می کنید، که منجر به یک چارچوب محکم برای بازخورد، با توانایی پیاده سازی مجدد منطق به طور مداوم می شود. بسته خطاها قابلیت های بیشتری را برای مدیریت خطا ارائه می دهد.
بسته خطاها
بسته errors یکی از بسته های موجود در کتابخانه استاندارد Go است. این بسته اصول اولیه و عملکردهای ساده مدیریت خطا را برای ایجاد و دستکاری خطاها به طور مداوم در کد Go ارائه می دهد.
این بسته تابع New را برای ایجاد خطا با پیامهای خطای سفارشی ارائه میکند که میتوانید به همان شیوه هر نوع خطای داخلی، مانند روش nil و Error رابط خطا، استفاده کنید.
بسته خطاها همچنین عملکردی را برای بسته بندی و بازکردن خطاها، روشی برای اظهار نوع خطاها، ارائه می دهد.
می توانید بسته خطاها را با کلمه کلیدی import وارد کنید. به سادگی نام بسته را در لیست واردات خود مشخص کنید.
import "errors"
گرفتن و رسیدگی به خطاها در Go
دانش مدیریت خطاهای اساسی در Go، پایه و اساس درک بسته خطاها را می گذارد. توابع و روش ها خطاهایی را که با یک منبع همراه هستند برمی گرداند.
در اینجا نمونه ای از مدیریت خطا از عملیات باز کردن فایل با بسته OS داخلی آورده شده است.
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Open("filename.txt")
if err != nil {
fmt.Println(err)
}
// ...
}
روش Open بسته os هنگام کار با فایل های متنی در Go مفید است. یک فایل را باز می کند، یک نمونه فایل باز و یک خطا را برمی گرداند.
مقدار خطا می تواند از نوع صفر باشد که نشان دهنده عدم وجود خطا است. با این حال، میتوانید یک مورد غیر صفر را بررسی کنید و در صورت وجود خطا، آن را مدیریت کنید. در مورد بالا، بلوک if خطا را چاپ می کند.
برای استخراج اطلاعات بیشتر در مورد خطا (معمولاً توضیحات) می توانید به روش Error یک خطا دسترسی داشته باشید.
if err != nil {
fmt.Println(err.Error())
}
به عنوان مثال، اگر فایل وجود نداشته باشد، یک پیغام خطایی را مشاهده خواهید کرد که چیزی شبیه به این است:
ایجاد خطا در Go
می توانید با متد New از بسته خطاها خطا ایجاد کنید. این متد یک پیام رشته ای دریافت می کند و خطاهای مواجه شده را برمی گرداند.
import "errors"
func main() {
err := errors.New("something went wrong")
if err != nil {
// error handling code goes here
}
}
تابع main یک خطای جدید ایجاد می کند و خطاهای احتمالی ایجاد خطا را با دستور if کنترل می کند.
همچنین می توانید خطاهای سفارشی را در Go تعریف کنید. روش مرسوم از یک ساختار و یک تابع خطا برای پیاده سازی ساختار بر اساس عملکرد خطا استفاده می کند.
package main
import "fmt"
type customError struct {
info string
}
func main() {
// example instantiation of the struct
err := customError{
info: "Something went wrong!",
}
// output the instance of the struct
fmt.Println(err)
}
ساختار customError طرحی برای خطا است و فیلد رشته اطلاعات پیام خطا را نگه می دارد.
توابع خطای شما می توانند ساختار customError را پیاده سازی کنند و یک رشته خطا را برگردانند.
func (ce customError) Error() string {
return fmt.Sprintf("A custom error occurred: %v", ce.info)
}
روش Error از ساختار customError یک رشته را با استفاده از روش قالببندی Sprintf بسته fmt برمیگرداند.
خطاهای بسته بندی و بازکردن در Go
شما می توانید اطلاعات متنی بیشتری را با قرار دادن خطاها به آنها اضافه کنید. شما در درجه اول از خطاهای پیچیده برای ایجاد پیام های خطای واضح برای دقت در اشکال زدایی استفاده خواهید کرد.
می توانید از روش Errorf بسته fmt استفاده کنید که قابلیت قالب بندی پیام های خطا را برای بسته بندی خطاها فراهم می کند. متد Errorf یک فعل قالب بندی رشته و رشته و خطا را می گیرد و خطای پیچیده شده را برمی گرداند.
import (
"fmt"
"os"
)
func main() {
_, err := os.Open("filename.txt")
if err != nil {
wrappedErr := fmt.Errorf("Error opening file: %v", err)
fmt.Println(wrappedErr)
}
}
تابع main فایلی را با روش Open بسته os باز می کند و خطا را با روش Errorf بسته fmt می پیچد. سپس خطای wrapped را به کنسول ارسال می کند.
با روش Unwrap بسته errors می توانید خطاهای wrapped را در برنامه های خود باز کنید. متد Unwrap خطای wrapped را دریافت می کند و خطای unwrapped را برمی گرداند.
import (
"fmt"
"os"
"errors"
)
func main() {
_, err := os.Open("filename.txt")
if err != nil {
wrappedErr := fmt.Errorf("Error opening file: %v", err)
unwrappedErr := errors.Unwrap(wrappedErr)
fmt.Println(unwrappedErr)
}
}
تابع اصلی یک خطا از عملیات باز کردن فایل را جمع می کند و متغیر unwrappedErr خطای unwrapped را نگه می دارد.
گزارش های خطای خود را با این بسته های ثبت شخص ثالث ثبت کنید
شما باید برخی از خطاها را برای بررسی های بعدی، اشکال زدایی و سایر عملیات در طول فرآیند توسعه برنامه خود ثبت کنید. می توانید از بسته zap توسط بسته های Uber، Logrus، Zerolog و Log15 برای ثبت سریع و ساختار یافته استفاده کنید.