Skip to content

Commit

Permalink
Update 1.13-defer-panic-recovery.md
Browse files Browse the repository at this point in the history
تصحیح متن
  • Loading branch information
r3a70 committed May 30, 2023
1 parent 100898d commit 4a74e7c
Showing 1 changed file with 14 additions and 10 deletions.
24 changes: 14 additions & 10 deletions content/chapter 1/1.13-defer-panic-recovery.md
Original file line number Diff line number Diff line change
Expand Up @@ -183,16 +183,16 @@ main.main()
exit status 2
```

در تابع فوق ما یک تابع نوشتیم که به عنوان ورودی یک اسلایس از نوع رشته و یک ایندکس از نوع عدد از ما دریافت میکند و المنت **ایندکسم**‌ اون اسلایس را برای ما چاپ میکند `در مثال بالا اندیس شماره 2. یعنی اندیس شماره 2 از اسلایسی که به عنوان ورودی گرفته است`. این کار ما باعث بروز یک **panic** میشود, فکر میکنید به چه دلیل ؟ بله به این دلیل که اسلایس ما اندیس شماره 2 ندارد. دلیل آن هم این است که اندیس از 0 شروع میشود.
در تابع فوق ما یک تابع نوشتیم که به عنوان ورودی یک اسلایس از نوع رشته و یک ایندکس از نوع عدد از ما دریافت میکند و المنت **ایندکسم**‌ اون اسلایس را برای ما چاپ میکند `در مثال بالا یعنی اندیس شماره 2`. این کار ما باعث بروز یک **panic** میشود, فکر میکنید به چه دلیل ؟ بله به این دلیل که اسلایس ما اندیس شماره 2 ندارد و دلیل آن هم این است که اسلایس, لیست و .... از 0 شروع میشوند.

پنیک یک سری اطلاعات در مورد چرایی بوجود امدنش به ما میدهد که در ادامه آنهارو توضیح دادیم:
- پانیک رخ داده شامل متن خطا
- پنیک رخ داده شامل متن خطا
- محل رخ دادن panic در قالب stacktrace


### 1.13.2.2 خطای panic از قبل تعیین شده توسط برنامه نویس

همانطور که گفتیم شما می توانید هرجایی از بدنه توابع خود تابع panic را فراخوانی که تا برنامه در آن محل خطایی را نمایش و متوقف شود.
همانطور که گفتیم شما می توانید هرجایی از بدنه توابع خود, تابع panic را فراخوانی کنید **البته این روش پیشنهاد نمیشود و روش پیشنهادی استفاده از شیوه ی ارور هندلینگ خود گولنگ است و فقط در صورت لزوم بهتر است از پنیک استفاده شود. همینطور شما باید در داکیومنت برنامه ذکر کنید که کدام قسمت برنامه امکان پنیک را دارد تا دیگران بتوانند در صورت لزوم آن را recover کنند. recover را در ادمه توضیح خواهم داد.** تا برنامه در آن محل خطایی را نمایش داده و متوقف شود.

```go
package main
Expand Down Expand Up @@ -226,20 +226,22 @@ exit status 2
```

{{< hint info >}}
توجه کنید استفاده از تابع panic در برخی مواقع مفید می باشد به عنوان مثال قصد دارید هنگام اجرا یکسری تنظیمات از سمت کاربر دریافت کنید و در صورتیکه تنظیمات دارای مشکل باشد می توانید با استفاده panic جلو ادامه روند برنامه را بگیرید تا کاربر خطا را رفع کند.
توجه کنید استفاده از تابع panic در برخی مواقع مفید می باشد. به عنوان مثال قصد دارید هنگام اجرای برنامه, یکسری تنظیمات از سمت کاربر دریافت کنید و در صورتیکه تنظیمات دارای مشکل بودند, می توانید با استفاده panic جلوی ادامه روند برنامه را بگیرید تا کاربر خطا را رفع کند.
{{< /hint >}}

## 1.13.3 بازیابی (recovery)

برخی اوقات panic ها غیرقابل پیش بینی می باشند و ممکن است در حال حاضر برنامه شما بدون هیچ خطایی اجرا شوند و به روند خود ادامه دهد اما ممکن است به دلیل اشتباه panic رخ دهد و برنامه شما کاملا متوقف و باعث از دست دادن وضعیت استیبل برنامه شود.
برخی اوقات panic ها غیرقابل پیش بینی میشوند. ممکن است برنامه شما بدون هیچ خطایی اجرا شود و به روند خود ادامه دهد, اما این هم ممکن است که به یک دلیل نامعلوم یا بهتر است بگوییم پیش بینی نشده, panic رخ دهد و برنامه شما کاملا متوقف و باعث از دست دادن وضعیت استیبل برنامه شود.

به همین منظور یک تابع به نام `recover` وجود دارد که پس از رخ دادن panic برنامه مجدد بتواند به وضعیت قبلی خود بازگردد تا بعدا خطای panic رخ داده را بررسی و رفع کنیم.
به همین منظور در گولنگ یک تابع به نام `recover` وجود دارد که پس از رخ دادن panic در برنامه, این قابلیت را به ما میدهد تا بتوانیم برنامه را به وضعیت قبلی خود بازگردانیم تا بعدا خطای panic رخ داده را بررسی و رفع کنیم.

```go
func recover() interface{}
```

یک نمونه کد استفاده از recover :
همینطور که شما هم میبینید, تابع ریکاور هیچ ورودی ای نمیگیرد و یک خروجی از تایپ `interface` را برمیگرداند.

به مثالی که در مورد تابع **recover** زدیم نگاه کنید:

```go
package main
Expand Down Expand Up @@ -274,12 +276,12 @@ Recovering from panic: Out of bound access for slice
Exiting normally
```

در کد فوق ما یک تابع داریم که این تابع یک اندیسی از یک slice را چاپ می کند اما اگر این اندیس خارج از تعداد المنت های slice باشد یک خطای panic رخ می دهد.
ما برای جلوگیری از خطای panic تابع handleOutOfBounds با استفاده defer درون تابع checkAndPrint قرار دادیم که پس از رخ دادن panic بصورت خودکار بازیابی صورت بگیرد تا برنامه ما متوقف نشود.
در کد فوق ما یک تابع داریم که در این تابع یک المنت از یک اسلایس را چاپ می کند, اما اگر این اندیس خارج از تعداد المنت های اسلایس باشد یک خطای panic رخ می دهد.
ما برای جلوگیری از خطای panic تابع handleOutOfBounds را با استفاده defer درون تابع checkAndPrint قرار دادیم که پس از رخ دادن panic بصورت خودکار بازیابی صورت بگیرد تا برنامه ما متوقف نشود.

## 1.13.4 چاپ اطلاعات stacktrace پس از بازیابی

شما می توانید پس از اینکه بازیابی کردید جزئیات بیشتر در خصوص خطای panic رخ داده بدست آوردید.
شما می توانید پس از اینکه بازیابی را انجام دادید, جزئیات بیشتری در خصوص خطای panic رخ داده بدست آوردید. به مثال زیر توجه کنید:

```go
package main
Expand Down Expand Up @@ -328,3 +330,5 @@ main.main()
Exiting normally
```

**برای چاپ اطلاعات stacktrace همانطور که میبینید ما از پگیج runtime که در کتابخانه استاندارد گولنگ وجود دارد استفاده کردیم**

0 comments on commit 4a74e7c

Please sign in to comment.