سه شنبه, ۱۶ بهمن, ۱۴۰۳ / 4 February, 2025
مجله ویستا

حوزه پویا (dynamic) در زبان C# در کجا وجود دارد؟


حوزه پویا (dynamic) در زبان C# در کجا وجود دارد؟

● برخورد با استثنا (Exception Handling)
چگونگی طرّاحی یک برنامه اهمّیّتی ندارد، همیشه ممکن است خطایی در طول اجرای آن رخ دهد. شما باید خطاها را پیش‏بینی کرده و آن‏ها را جزو برنامه به حساب آورید، …

برخورد با استثنا (Exception Handling)

چگونگی طرّاحی یک برنامه اهمّیّتی ندارد، همیشه ممکن است خطایی در طول اجرای آن رخ دهد. شما باید خطاها را پیش‏بینی کرده و آن‏ها را جزو برنامه به حساب آورید، در صورت به وجود آمدن خطاها یا استثناها، کد هست که آن‏ها را کنترل می‏کند. این کد باید در مراحل اوّلیّه توسعه، تصحیح شود. هدف ما، تولید کد قابل اطمینان و پایدار است.

یک راه برای برخورد با استثناها، صرف‏نظر کردن از برنامه است. به عنوان مثال، یک خطای رایج، تقسیم بر صفر است. اگر برنامه شما قرار باشد، کنترل یک رآکتور هسته‏ای را اجرا کند، چه‏طور؟ شما نمی‏توانید، برنامه خود را رها کنید. خطاها از طریق throw و catch استثناها، کنترل می‏شوند. throwing یک استثنا، روشی است که نشان می‏دهد چیزی بد کار کرده است. catch یک استثنا، روشی برای برخورد با استثنا است.

از ترکیب try/catch/finally برای کنترل استثناها استفاده می‏شود.

اگر یک استثنا throw شود، از بلوک try خارج شده و کنترل به آن برنمی‏گردد. حال هر متد غیر void باید یک مقدار برگرداند و عبارت بازگشتی بعد از کدی است که خطا در آن رخ داده است. این منجر به تضاد می‏شود. ما می‏توانیم عبارت بازگشتی را در بلوک اختیاری finally قرار دهیم. امکان دیگر این است که عبارت بازگشتی را کاملا بیرون عبارت try / catch قرار دهیم.

نحو برای throw و catch

بعد از یک بلوک try، باید یک یا چند بلوک catch برای کنترل انواع به‏خصوصی از استثناها وجود داشته باشد. هیچ تداخل کدی بین بلوک‏ها نمی‏تواند وجود داشته باشد. یک بلوک ممکن است برای یک خطا چک کند و یک استثنا را throw کند و استثنا را در جای دیگری از کد، کنترل کند. عنصر اصلی برای تحقّق کنترل استثنا این است که بلوک catch – کنترل‏کننده استثنا – از کدی که استثنا را throw می‏کند – بلوک try -، مجزّاست. بلوک try حاوی الگوریتم معمولی است. بلوک catch، شامل کدی برای شرایط کنترل استثناست.

یک استثنا ممکن است تنها در طول یک بلوک try حاوی به صورت پویا، throw شود؛ یعنی عبارت throw باید متعلّق به حوزه دینامیک (پویا) یک بلوک try بیرونی باشد. حوزه پویا به چگونگی اجرای برنامه برمی‏گردد. به آن‏چه که در عمل اتّفاق می‏افتد، دقّت کنید. حوزه ایستا (استاتیک) به چگونگی نوشته شدن برنامه اطلاق می‏شود. تعاریف آن را ملاحظه کنید. حوزه پویا تنها با اجرای برنامه مشخّص می‏شود. شما نمی‏توانید لزوما آن را با خواندن برنامه، تعیین کنید.

حوزه ایستا به روش نوشته شدن برنامه اطلاق می‏شود. تمامی متغیّرهای محلّی و پارامترهای یک متد، در حوزه استاتیک آن هستند. حوزه ایستا تنها با خواندن برنامه مشخّص می‏شود. حوزه پویا را می‏توان با اجرای برنامه تعیین کرد.

هنگامی که یک استثنا throw می‏شود، زبان از هر دو حوزه ایستا و پویا استفاده می‏کند تا برای کنترل آن، یک شرط catch بیابد. زبان می‏داند که چگونه برنامه تعریف شده است که همان حوزه ایستای متدهای آن را تعریف می‏کند. زبان همچنین یک رکورد از هر متد که در برنامه فراخوانی می‏شود، در پشته فراخوانی متد قرار می‏دهد. یک جنبه مهمّ پشته فراخوانی متد این است که متد در حال اجرا همواره توسّط بلوک بالایی در پشته فراخوانی متد، نمایش داده می‏شود.

هنگامی که یک استثنا رخ می‏دهد، زبان در سرتاسر برنامه به عقب trace می‏کند تا یک شرط مناسب catch بیابد. عمل trace از بلوکی که استثنا را throw کرد، شروع می‏شود. اگر استثنا در متدی که در آن throw شده است، catch نشود، زبان از پشته فراخوانی متد استفاده می‏کند تا از طریق فراخوانی‏های متدها در طول اجرا، جستجو را انجام دهد.

محمد معصومی شهربابک