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