21.آموزش GO با مثال(خطاها)

در زبان گو برای ارتباط برقرار کردن با خطاها به صورت صریح از طریق یک مقدار بازگشتی روالی وجود دارد.این در مقابل استثنائاتی که در زبانهای جاوا و روبی و همچنین مقدار سربارهای نتیجه /خطا که گاهی در زبان سی دیده میشود استفاده میشود. گو خیلی مارو به این موضوع نزدیک میکنه که ببینیم کدام تابع خطاها رو برمیگردونه یا آنها را با استفاده از ساختارهای زبان مشابه که برای هر کدام استفاده می شه،برای وظایف غیر خطا رسیدگی میکنه.

package main
import "errors"
import "fmt"

طبق قرارداد, خطاها آخرین مقدار بازگشتی را دارند ، و نوع error,میپذیرند که یک اینترفیس داخلی است .

func f1(arg int) (int, error) {
    if arg == 42 {

نحو errors.New یک مقدار errorرا با پذیرفتن یک پیام خطا میسازد.

       return -1, errors.New("can't work with 42")
   }

یک مقدار nil در موقعیت خطا نشون میده که این قسمت خطایی اتفاق نیوفتاده است.

   return arg + 3, nil
}

این امکان هست که ما خطاهای سفارشی شده مانند errorرا به وسیله متد ()Error روی اونها اجرا کنیم . اینجا یک مثال متفاوت از مثال بالا داریم که از نوع خطای سفارشی شده به عنوان آرگومان خطا استفاده میکند.

type argError struct {
    arg  int
    prob string
}
func (e *argError) Error() string {
    return fmt.Sprintf("%d - %s", e.arg, e.prob)
}
func f2(arg int) (int, error) {
    if arg == 42 {

در این حالت ما از نحو argError& برای ساختن یک سازه جدید , ارائه مقادیر برای دو فیلد argو probاستفاده کرده ایم.

       return -1, &argError{arg, "can't work with it"}
    }
    return arg + 3, nil
}
func main() {

دو حلقه زیر هر یک از توابع خطا-بازگشتی مارا تست میکنند. توجه داشته باشید که بررسی یک خطای درون خطی روی خط if یک کار رایج در کد نویسی گو میباشد.

   for _, i := range []int{7, 42} {
        if r, e := f1(i); e != nil {
            fmt.Println("f1 failed:", e)
        } else {
            fmt.Println("f1 worked:", r)
        }
    }
    for _, i := range []int{7, 42} {
        if r, e := f2(i); e != nil {
            fmt.Println("f2 failed:", e)
        } else {
            fmt.Println("f2 worked:", r)
        }
    }

اگر می خواهید به صورت برنامه نویسی وار از داده ها در یک خطای سفارشی استفاده کنید، شما نیاز دارید تا خطا را به عنوان نمونه از نوع خطای سفارشی از طریق نوع اعلانی(type-assertion) دریافت کنید.

   _, e := f2(42)
    if ae, ok := e.(*argError); ok {
        fmt.Println(ae.arg)
        fmt.Println(ae.prob)
    }
}

اجرای این برنامه

$ go run errors.go
f1 worked: 10
f1 failed: can't work with 42
f2 worked: 10
f2 failed: 42 - can't work with it
42
can't work with it

این پست کامل را روی بلاگ گو برای اطلاعات بیشتر در مورد رسیدگی به خطاها بررسی کنید.

<<اینترفیس ها-------------------------------------------(روال های گو)Goroutines>>