Skip to content

Commit 4319d03

Browse files
author
Saeid Darvish
authored
Merge pull request #37 from saeiddrv/draft
l23: updating#000124
2 parents be02ed9 + ec97327 commit 4319d03

4 files changed

Lines changed: 66 additions & 7 deletions

File tree

30.2 KB
Loading

lessons/l08.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
:keywords: آموزش, آموزش پایتون, آموزش برنامه نویسی, پایتون, انواع شی, انواع داده, انواع شی در پایتون, انواع داده در پایتون, پایتون
66

77

8-
درس ۰۸: انواع داده یا شی در پایتون: set ،dict ،tuple، list و None
8+
درس ۰۸: انواع داده یا شی در پایتون: set ،dict ،tuple ،list و None
99
====================================================================================
1010

1111
.. figure:: /_static/pages/08-python-built-in-data-types-2.jpg

lessons/l23.rst

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177

178178
در زبان‌های برنامه‌نویسی صدای اعتراض یک Exception قابل درک و تشخیص است و می‌توان برای آن‌ها فرآیندی را پیش‌بینی کرد که بروز آن‌ها نه تنها باعث اتمام برنامه نشود بلکه برنامه بتواند در مسیر درست به اجرای خود ادامه دهد.
179179

180-
در زبان برنامه‌نویسی پایتون دستور ``try/except`` برای همین منظور فراهم دیده شده است [`اسناد پایتون <https://docs.python.org/3/reference/compound_stmts.html#the-try-statement>`__].
180+
در زبان برنامه‌نویسی پایتون دستور ``try/except`` برای همین منظور فراهم دیده شده است [`اسناد پایتون <https://docs.python.org/3/reference/compound_stmts.html#the-try-statement>`__] و در ادامه به بررسی انواع ساختار قابل پیاده‌سازی از این دستور خواهیم پرداخت.
181181

182182
``try/except``
183183
------------------------
@@ -400,10 +400,6 @@
400400
شی Exception که توسط دستور ``except`` دریافت می‌گردد تنها در داخل بدنه همان دستور ``except`` در دسترس خواهد بود، چرا که بلافاصله پس از اتمام دستورات داخل بدنه آن ``except``، شی مذکور نیز به صورت خودکار حذف می‌گردد.
401401

402402

403-
404-
405-
406-
407403
``try/except/else``
408404
------------------------
409405

@@ -681,6 +677,47 @@
681677
******************************
682678
--------> Finished!
683679

680+
روند انتشار Exception
681+
----------------------------
682+
683+
در تمام مثال‌هایی که در این بخش ارائه شد، برای ساده‌سازی مطلب تنها به بررسی مدیریت خطا داخل یک تابع پرداختیم. ولی باید این مورد را در نظر داشته باشید، زمانی که یک Exception رخ می‌دهد، این Exception به ترتیب مراحل فراخوانی را به ابتدای اجرا در برنامه طی می‌کند و هر بار چنانچه یک handler (دستور ``try`` با ``except`` مناسب) پیدا نشود، این Exception به مرحله پیش‌تر تحویل داده می‌شود تا شاید یک handler برای آن پیدا شود. این روند تا رسیدن به اسکریپت (فایل py. اصلی برنامه) ادامه می‌یابد و در صورت عدم پیش‌بینی handler آنگاه Exception در این نقطه بروز و منجر به توقف کل برنامه می‌گردد. به عنوان مثال نمونه کد زیر را در نظر بگیرید:
684+
685+
686+
.. code-block:: python
687+
:linenos:
688+
689+
def print_sum_div_first(a, b):
690+
sum = a + b
691+
div = sum / a
692+
print(div)
693+
694+
695+
def action(a, b):
696+
try:
697+
if isinstance(a, int):
698+
print_sum_div_first(a, b)
699+
700+
except ZeroDivisionError as err:
701+
print(f'[action function ERROR!!!] {err.__class__.__name__}')
702+
703+
704+
try:
705+
action(5, 6) # Successfully
706+
action(0, 8) # raise ZeroDivisionError
707+
action(3, 'G') # raise TypeError
708+
709+
except Exception as err:
710+
print(f'[module ERROR!!!] {err.__class__.__name__}')
711+
712+
::
713+
714+
2.2
715+
[action function ERROR!!!] ZeroDivisionError
716+
[module ERROR!!!] TypeError
717+
718+
در نمونه کد بالا همانطور که مشخص است تمام Exceptionها در داخل تابع ``print_sum_div_first`` رخ می‌دهد ولی از آنجا که این تابع فاقد handler می‌باشد، Exceptionها به یک مرحله قبل‌تر یعنی تابع ``action`` تحویل می‌گردند، ولی این تابع تنها یک handler برای ``ZeroDivisionError`` داشته پس تمامی Exceptionهای احتمالی دیگر از جمله ``TypeError`` به یک مرحله قبل‌تر تحویل و خوشبختانه در آن‌جا handle می‌شوند!
719+
720+
684721

685722
مدیریت خطای تودرتو (Nested Exception Handling)
686723
---------------------------------------------------
@@ -690,12 +727,24 @@
690727
البته از آنجا که در یکی از بندهای فلسفه پایتون آمده: `PEP 20: Flat is better than nested <https://www.python.org/dev/peps/pep-0020/>`__ انجام این‌کار چندان پایتونی نمی‌باشد و برنامه‌نویس احتمالا می‌تواند با کمی دقت بیشر از ساختار تودرتو پرهیز کند و کدی به مراتب خواناتر توسعه دهد. به هر حال امکان این کار در زبان برنامه‌نویسی پایتون برای برنامه‌نویس محفوظ نگه‌داشته شده است.
691728

692729

730+
کارایی (Performance)
731+
----------------------------
732+
733+
همیشه این سوال مطرح می‌شود که آیا بهتر است با کنترل شرط و پیاده‌سازی چندین دستور ``if`` از بروز Exception جلوگیری کنیم یا خیلی ساده این وظیفه را به یک ساختار handler بسپاریم. کدام روش کارایی بهتری دارد؟
734+
735+
زبان برنامه‌نویسی پایتون از نظریه «درخواست بخشش راحت‌تر از کسب اجازه است» پیروی می‌کند [`EAFP: Easier to ask for forgiveness than permission <https://docs.python.org/3/glossary.html?highlight=eafp#term-eafp>`__]. بر همین اساس پایتون به صورت پیش‌فرض تمام مقادیر را صحیح فرض می‌کند و زمانی اگر خلاف این فرض رخ دهد، آنگاه برای عرض پوزش به دنبال یک handler مناسب می‌گردد!
736+
737+
مطمئنا سربار handle کردن یک Exception از یک دستور ``if`` بیشتر است ولی تنها وقتی یک Exception به handler نیاز پیدا می‌کند که رخ بدهد! پیشنهاد پایتونی برای این مسئله ترجیح بر استفاده از دستور ``try/except`` می‌باشد تا دستور ``if``، چرا که هم خوانایی کد بیشتر می‌شود و هم از آنجایی که در صورت استفاده از دستور ``if`` روند اجرای کنترل و بررسی شرط هربار در برنامه رخ می‌دهد ولی عمل جستجو برای یافتن ``except`` مناسب تنها در زمان رخ دادن Exception انجام خواهد شد، کارایی بهتری کسب می‌گردد.
738+
739+
740+
[`مطالعه بیشتر:‌ پرسش و پاسخ مرتبط در StackOverflow <https://stackoverflow.com/q/7604636>`__]
741+
693742

694743

695744
Exception Hierarchy
696745
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
697746

698-
در زبان برنامه‌نویسی پایتون تمامی Exceptionهای از پیش آماده در قالب کلاس‌هایی در یک سلسله مراتب از وراثت ارايه شده است. برای مشاهده این کلاس‌ها و ساختار وراثت آن‌ها می‌توانید به اسناد پایتون مراجعه نمایید:‌ `Exception hierarchy <https://docs.python.org/3/library/exceptions.html#exception-hierarchy/>`__ - این ساختار توسط تصویر پایین نمایش داده شده است:
747+
در زبان برنامه‌نویسی پایتون تمامی Exceptionهای از پیش آماده در قالب کلاس‌هایی در یک سلسله مراتب از وراثت ارايه شده است. برای مشاهده این کلاس‌ها و ساختار وراثت آن‌ها می‌توانید به اسناد پایتون مراجعه نمایید:‌ `Exception hierarchy <https://docs.python.org/3/library/exceptions.html#exception-hierarchy>`__ - این ساختار توسط تصویر پایین نمایش داده شده است:
699748

700749

701750
.. image:: /_static/l23-python-exception-hierarchy.png

log.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@
1111

1212

1313

14+
.. raw:: html
15+
16+
<p class="rubric" id="00124" ><a class="reference external" href="#00124">00124</a> - سه‌شنبه ۱۰ فروردین ۱۴۰۰</p>
17+
18+
* بروزرسانی: مبحث «روند انتشار Exception» به درس بیست و سوم اضافه گردید.
19+
* بروزرسانی: مبحث «کارایی (Performance)» به درس بیست و سوم اضافه گردید.
20+
21+
22+
23+
----
1424

1525

1626
.. raw:: html

0 commit comments

Comments
 (0)