آموزش پایتون - بلوک Try تو در تو

بلوک try تو در تو در پایتون

در یک برنامه پایتون، اگر ساختار try-except دیگری درون یک بلوک try یا درون بلوک except آن قرار داشته باشد، به آن بلوک try تو در تو (nested-try) می‌گویند. این کار زمانی مورد نیاز است که بلوک‌های مختلف (مانند بلوک بیرونی و داخلی) ممکن است باعث خطاهای متفاوتی شوند. برای مدیریت آن‌ها، به بلوک‌های try تو در تو نیاز داریم.

کار را با مثالی آغاز می‌کنیم که دارای یک ساختار منفرد "try − except − finally" است. اگر دستورات داخل try با استثنا روبرو شوند، توسط بلوک except مدیریت می‌شوند. چه استثنا رخ دهد و چه رخ ندهد، بلوک finally همیشه اجرا می‌شود.

مثال ۱

در اینجا، بلوک try با وضعیت "تقسیم بر ۰" مواجه می‌شود، بنابراین بلوک except وارد عمل می‌شود. این بلوک برای مدیریت استثناهای عمومی با کلاس Exception آماده شده است.

a=10
b=0
try:
   print (a/b)
except Exception:
   print ("General Exception")
finally:
   print ("inside outer finally block")

این کد خروجی زیر را تولید خواهد کرد −

General Exception
inside outer finally block

مثال ۲

حال ببینیم چگونه ساختارهای try را تو در تو کنیم. یک بلوک "try − except − finally" دیگر را داخل بلوک try موجود قرار می‌دهیم. عبارت کلیدی except برای try داخلی اکنون استثناهای عمومی (Exception) را مدیریت می‌کند، در حالی که از بلوک except مربوط به try بیرونی می‌خواهیم که ZeroDivisionError را مدیریت کند.

از آنجایی که استثنا در بلوک try داخلی رخ نمی‌دهد، Except عمومی مربوط به آن فراخوانی نمی‌شود. وضعیت تقسیم بر ۰ توسط عبارت except بیرونی مدیریت می‌شود.

a=10
b=0
try:
   print (a/b)
   try:
      print ("This is inner try block")
   except Exception:
      print ("General exception")
   finally:
      print ("inside inner finally block")
      
except ZeroDivisionError:
   print ("Division by 0")
finally:
   print ("inside outer finally block")

این کد خروجی زیر را تولید خواهد کرد −

Division by 0
inside outer finally block

مثال ۳

اکنون وضعیت را معکوس می‌کنیم. از بین بلوک‌های try تو در تو، در بلوک بیرونی هیچ استثنایی رخ نمی‌دهد، اما دستوری که باعث تقسیم بر ۰ می‌شود داخل try داخلی است و بنابراین استثنا توسط بلوک except داخلی مدیریت می‌شود. بدیهی است که بخش except مربوط به try بیرونی فراخوانی نخواهد شد.

a=10
b=0
try:
   print ("This is outer try block")
   try:
      print (a/b)
   except ZeroDivisionError:
      print ("Division by 0")
   finally:
      print ("inside inner finally block")
      
except Exception:
   print ("General Exception")
finally:
   print ("inside outer finally block")

این کد خروجی زیر را تولید خواهد کرد −

This is outer try block
Division by 0
inside inner finally block
inside outer finally block

در پایان، به بررسی وضعیت دیگری می‌پردازیم که ممکن است در صورت وجود بلوک‌های تو در تو رخ دهد. در حالی که هیچ استثنایی در try بیرونی وجود ندارد، بلوک except مناسبی نیز برای مدیریت استثنای داخل بلوک try داخلی وجود ندارد.

مثال ۴

در مثال زیر، try داخلی با "تقسیم بر ۰" مواجه می‌شود، اما except مربوط به آن به دنبال KeyError است نه ZeroDivisionError. بنابراین، شیء استثنا به بلوک except بعدی که مطابق با دستور try بیرونی است منتقل می‌شود. در آنجا، استثنای ZeroDivisionError به دام افتاده و مدیریت می‌شود.

a=10
b=0
try:
   print ("This is outer try block")
   try:
      print (a/b)
   except KeyError:
      print ("Key Error")
   finally:
      print ("inside inner finally block")
      
except ZeroDivisionError:
   print ("Division by 0")
finally:
   print ("inside outer finally block")

این کد خروجی زیر را تولید خواهد کرد −

This is outer try block
inside inner finally block
Division by 0
inside outer finally block

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.