|
677 | 677 | ****************************** |
678 | 678 | --------> Finished! |
679 | 679 |
|
| 680 | + |
680 | 681 | روند انتشار Exception |
681 | 682 | ---------------------------- |
682 | 683 |
|
|
718 | 719 | در نمونه کد بالا همانطور که مشخص است تمام Exceptionها در داخل تابع ``print_sum_div_first`` رخ میدهد ولی از آنجا که این تابع فاقد handler میباشد، Exceptionها به یک مرحله قبلتر یعنی تابع ``action`` تحویل میگردند، ولی این تابع تنها یک handler برای ``ZeroDivisionError`` داشته پس تمامی Exceptionهای احتمالی دیگر از جمله ``TypeError`` به یک مرحله قبلتر تحویل و خوشبختانه در آنجا handle میشوند! |
719 | 720 |
|
720 | 721 |
|
721 | | - |
722 | 722 | مدیریت خطای تودرتو (Nested Exception Handling) |
723 | 723 | --------------------------------------------------- |
724 | 724 |
|
|
727 | 727 | البته از آنجا که در یکی از بندهای فلسفه پایتون آمده: `PEP 20: Flat is better than nested <https://www.python.org/dev/peps/pep-0020/>`__ انجام اینکار چندان پایتونی نمیباشد و برنامهنویس احتمالا میتواند با کمی دقت بیشر از ساختار تودرتو پرهیز کند و کدی به مراتب خواناتر توسعه دهد. به هر حال امکان این کار در زبان برنامهنویسی پایتون برای برنامهنویس محفوظ نگهداشته شده است. |
728 | 728 |
|
729 | 729 |
|
| 730 | + |
| 731 | +مدیریت خطا و دستور ``with`` |
| 732 | +-------------------------------------- |
| 733 | + |
| 734 | +از درس بیست و یکم با مفهوم Context Manager و ارتباط آن با دستور ``with`` آشنا هستیم. اینکه مدیریت خطا برای این ساختار چگونه باشد به این بستگی دارد که میخواهیم در کدام نقطه Exception احتمالی را handle کنیم. بر اساس مفهوم Context Manager، در چند نقطه زیر احتمال بروز Exception وجود دارد: |
| 735 | + |
| 736 | +* داخل متد ``__init__`` کلاس ContextManager |
| 737 | +* داخل متد ``__enter__`` کلاس ContextManager |
| 738 | +* داخل بدنه دستور ``with`` |
| 739 | +* داخل متد ``__exit__`` کلاس ContextManager |
| 740 | + |
| 741 | + |
| 742 | +اگر برایمان مهم نباشد میتوانیم به صورت زیر یک handler برای بروز Exceptionهای احتمالی در تمام حالات بالا پیادهسازی نماییم:: |
| 743 | + |
| 744 | + |
| 745 | + try: |
| 746 | + with ContextManager(): |
| 747 | + do_something() |
| 748 | + except Exception as err: |
| 749 | + pass |
| 750 | + |
| 751 | + |
| 752 | +در غیر این صورت میتوانید مشابه نمونه کد زیر عمل نمایید:: |
| 753 | + |
| 754 | + try: |
| 755 | + context_manager = ContextManager() |
| 756 | + |
| 757 | + except Exception as err: |
| 758 | + # Handler for: '__init__' |
| 759 | + |
| 760 | + else: |
| 761 | + try: |
| 762 | + with context_manager: |
| 763 | + try: |
| 764 | + do_something() |
| 765 | + |
| 766 | + except Exception as err: |
| 767 | + # Handler for: 'with' body |
| 768 | + |
| 769 | + except Exception as err: |
| 770 | + # Handler for: '__enter__' and '__exit__' |
| 771 | + |
| 772 | + |
| 773 | +[`PEP 343 - Specification: The 'with' Statement <https://www.python.org/dev/peps/pep-0343/#specification-the-with-statement>`__] |
| 774 | + |
| 775 | + |
730 | 776 | کارایی (Performance) |
731 | 777 | ---------------------------- |
732 | 778 |
|
|
0 commit comments