مدیریت خطاها یکی از ویژگیهای حیاتی برای نوشتن کدهای قابل اعتماد و پایدار است. در این بخش، کدی اضافه خواهید کرد تا یک خطا را از ماژول greetings بازگرداند و سپس آن را در برنامه فراخواننده (Caller) مدیریت کند.
💡 نکته: این موضوع بخشی از یک آموزش چندبخشی است که با بخش «ساخت یک ماژول گو» آغاز میشود.
۱. در فایل greetings/greetings.go کدهای زیر را جایگزین کنید.
اگر ندانید چه کسی را باید مورد خطاب قرار دهید، فرستادن پیام خوشآمد گویی معنایی ندارد. اگر ورودی نام خالی باشد، یک خطا به فراخواننده بازگردانید. کد زیر را درون greetings.go کپی کرده و فایل را ذخیره کنید:
package greetings
import (
"errors"
"fmt"
)
// Hello returns a greeting for the named person.
func Hello(name string) (string, error) {
// If no name was given, return an error with a message.
if name == "" {
return "", errors.New("empty name")
}
// If a name was received, return a value that embeds the name
// in a greeting message.
message := fmt.Sprintf("Hi, %v. Welcome!", name)
return message, nil
}
در این کد، شما:
-
تابع را طوری تغییر میدهید که دو مقدار را بازگرداند: یک
stringو یکerror. فراخواننده شما مقدار دوم را بررسی میکند تا ببیند آیا خطایی رخ داده است یا خیر. (هر تابعی در گو میتواند چندین مقدار بازگرداند. برای اطلاعات بیشتر، بخش Effective Go را ببینید). -
پکیج
errorsاز کتابخانه استاندارد گو را Import میکنید تا بتوانید از تابعerrors.Newآن استفاده کنید. -
یک دستور
ifاضافه میکنید تا درخواستهای نامعتبر (یک رشته خالی به جای نام) را بررسی کند و در صورت نامعتبر بودن درخواست، یک خطا بازگرداند. تابعerrors.Newیک خطا را همراه با پیام شما درون آن بازمیگرداند. -
مقدار
nil(به معنی عدم وجود خطا) را به عنوان مقدار دوم در بازگشتهای موفقیتآمیز قرار میدهید. به این ترتیب، فراخواننده متوجه میشود که تابع با موفقیت اجرا شده است.
۲. در فایل hello/hello.go خود، خطایی را که اکنون توسط تابع Hello بازگردانده میشود، همراه با مقدار غیرخطا مدیریت کنید.
کد زیر را درون hello.go بچسبانید (Paste کنید):
package main
import (
"fmt"
"log"
"example.com/greetings"
)
func main() {
// Set properties of the predefined Logger, including
// the log entry prefix and a flag to disable printing
// the time, source file, and line number.
log.SetPrefix("greetings: ")
log.SetFlags(0)
// Request a greeting message.
message, err := greetings.Hello("")
// If an error was returned, print it to the console and
// exit the program.
if err != nil {
log.Fatal(err)
}
// If no error was returned, print the returned message
// to the console.
fmt.Println(message)
}
در این کد، شما:
-
پکیج
logرا پیکربندی میکنید تا نام دستور (" :greetings") را در ابتدای پیامهای لوگ خود، بدون برچسب زمان (Time stamp) یا اطلاعات فایل سورس چاپ کند. -
هر دو مقدار بازگشتی
Hello(شامل خطا) را به متغیرها اختصاص میدهید. -
آرگومان ورودی
Helloرا از نام Gladys به یک رشته خالی تغییر میدهید تا بتوانید کد مدیریت خطای خود را آزمایش کنید. -
وجود مقدار خطای غیر
nilرا بررسی میکنید. در صورتی که خطا وجود داشته باشد، ادامه دادن برنامه منطقی نیست. -
از توابع موجود در پکیج
logکتابخانه استاندارد برای خروجی دادن اطلاعات خطا استفاده میکنید. اگر خطایی دریافت کنید، از تابعFatalپکیجlogبرای چاپ خطا و متوقف کردن برنامه استفاده میکنید.
۳. در خط فرمان درون دایرکتوری hello، فایل hello.go را اجرا کنید تا از کارکرد درست کد مطمئن شوید.
اکنون که یک نام خالی ارسال میکنید، یک خطا دریافت خواهید کرد:
$ go run .
greetings: empty name
exit status 1
این روش رایج مدیریت خطا در گو است: بازگرداندن خطا به عنوان یک مقدار، تا فراخواننده بتواند وجود آن را بررسی کند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات