Trong một chương trình Python, nếu có một cấu trúc try-except khác nằm bên trong một khối try hoặc bên trong khối except của nó, thì được gọi là khối try lồng nhau. Điều này cần thiết khi các khối khác nhau như khối bên ngoài và bên trong có thể gây ra các lỗi khác nhau. Để xử lý chúng, chúng ta cần các khối try lồng nhau.
Chúng ta bắt đầu với một ví dụ có cấu trúc "try − except − finally" đơn lẻ. Nếu các câu lệnh bên trong try gặp phải ngoại lệ, nó sẽ được xử lý bởi khối except. Dù có xảy ra ngoại lệ hay không, khối finally luôn được thực thi.
Ở đây, khối try có tình huống "chia cho 0", do đó khối except được kích hoạt. Nó được trang bị để xử lý ngoại lệ chung với lớp Exception.
a=10 b=0 try: print (a/b) except Exception: print ("General Exception") finally: print ("inside outer finally block")
Nó sẽ tạo ra output −
General Exception inside outer finally block
Bây giờ hãy xem cách lồng ghép các cấu trúc try . Chúng ta đặt các khối "try − except − finally" khác bên trong khối try hiện có. Từ khóa except cho try bên trong hiện xử lý ngoại lệ chung (generic Exception), trong khi chúng ta yêu cầu khối except của try bên ngoài xử lý ngoại lệ ZeroDivisionError.
Vì ngoại lệ không xảy ra trong khối try bên trong, nên Except tổng quát tương ứng của nó không được gọi. Tình huống chia cho 0 được xử lý bởi điều khoản ngoại lệ bên ngoài.
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")
Nó sẽ tạo ra output −
Division by 0 inside outer finally block
Bây giờ chúng ta đảo ngược tình huống. Trong các khối lồng nhau try , khối bên ngoài không có bất kỳ ngoại lệ nào được nêu ra, nhưng câu lệnh gây ra phép chia cho 0 nằm bên trong khối try bên trong, và do đó ngoại lệ được xử lý bởi khối except bên trong. Rõ ràng, phần except tương ứng với try bên ngoài sẽ không được gọi đến.
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")
Nó sẽ tạo ra output −
This is outer try block Division by 0 inside inner finally block inside outer finally block
Cuối cùng, hãy thảo luận về một tình huống khác có thể xảy ra trong trường hợp các khối lồng nhau. Trong khi không có ngoại lệ nào trong try bên ngoài, thì cũng không có khối except phù hợp để xử lý ngoại lệ bên trong khối try lồng nhau.
Trong ví dụ sau, try bên trong: gặp phải "chia cho 0", nhưng except: tương ứng của nó lại tìm kiếm KeyError thay vì ZeroDivisionError. Do đó, đối tượng ngoại lệ được chuyển tiếp đến khối except: của câu lệnh except tiếp theo phù hợp với câu lệnh try: bên ngoài. Tại đó, ngoại lệ ZeroDivisionError được chặn và xử lý.
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")
Nó sẽ tạo ra output −
This is outer try block inside inner finally block Division by 0 inside outer finally block