مسیرها
/
Go
Go
/
تمرین‌ها
/
مدیریت خطا
مدیریت خطا

مدیریت خطا

متوسط

دستورالعمل‌ها

انواع مختلفی از مدیریت خطا و منابع را پیاده‌سازی کنید.

یکی از نکات مهم در برنامه‌نویسی این است که چگونه خطاها را مدیریت کنیم و منابع را حتی وقتی خطا رخ می‌دهد ببندیم.

این تمرین از شما می‌خواهد که خطاهای مختلفی را مدیریت کنید. از آنجا که مدیریت خطا تا حد زیادی به زبان برنامه‌نویسی بستگی دارد، باید به تست‌های مربوط به track خود مراجعه کنید تا ببینید دقیقاً چه چیزی لازم است.

پیاده‌سازی

اگر با خطاها یا panicها در Go تازه آشنا شده‌اید، پیشنهاد می‌کنیم ابتدا برای درک زمینه مستندات این مباحث را بخوانید.

در این تمرین باید تابعی به شکل Use(opener ResourceOpener, input string) error تعریف کنید که یک منبع را باز می‌کند، روی منبع حاصل Frob(input) را فراخوانی می‌کند و سپس آن منبع را می‌بندد (در همه‌ی حالت‌ها). تابع شما باید خطاها و panicها را به‌درستی مدیریت کند.

ResourceOpener opener تابعی است که می‌توانید مستقیماً آن را با opener() فراخوانی کنید تا منبع را «باز» کنید. این تابع یک Resource و یک مقدار خطا را به سبک مرسوم Go برمی‌گرداند:

برای تعریف‌های Resource، ResourceOpener، FrobError و TransientError فایل common.go را ببینید. راه‌حل خود را در همان پکیجی تعریف خواهید کرد که common.go و error_handling_test.go در آن قرار دارند: «erratum». این کار آن نوع‌ها را برای استفاده در راه‌حل شما در دسترس قرار می‌دهد.

در تابع Use شما چند جا ممکن است خطا رخ دهد:

  • فراخوانی تابع ResourceOpener که به‌عنوان پارامتر اول به Use داده شده است ممکن است با خطایی از نوع TransientError شکست بخورد؛ در این صورت به تلاش برای باز کردن منبع ادامه دهید. اگر خطای دیگری بود، آن را از تابع Use خود برگردانید.

  • فراخوانی تابع Frob روی Resource برگردانده‌شده از تابع ResourceOpener ممکن است با یک FrobError (یا نوع دیگری از خطا) panic کند. اگر واقعاً FrobError بود، باید تابع Defrob منبع را با استفاده از متغیر .defrobTag همان FrobErrorی که panic کرده، به‌عنوان ورودی تابع Defrob فراخوانی کنید. در هر صورت Use باید آن خطا را برگرداند.

  • یک نکته: اگر Resource با موفقیت باز شد، حتماً تابع Close آن را در هر شرایطی دقیقاً یک بار فراخوانی کنید (حتی اگر خطایی رخ داده باشد).

برای بررسی نوع‌های خاص خطا می‌توان از type assertions استفاده کرد. همچنین ممکن است لازم باشد به named return values نگاهی بیندازید که راهی مفید برای برگرداندن اطلاعات خطا هنگام بازیابی از panic است.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Go Exercism

آماده‌اید مدیریت خطا را شروع کنید؟

در Exercism ثبت‌نام کنید تا Go را همراه با 34 مفهوم165 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.