Trong hướng dẫn này, bạn sẽ học cách xử lý các ngoại lệ trong chương trình Python của mình bằng cách sử dụng các câu lệnh try, NGOẠI trừ và cuối cùng với sự trợ giúp của các ví dụ.
Video: Xử lý ngoại lệ trong Python (thử… ngoại trừ… cuối cùng)
Các ngoại lệ trong Python
Python có nhiều ngoại lệ tích hợp được đưa ra khi chương trình của bạn gặp lỗi (một cái gì đó trong chương trình bị lỗi).
Khi những ngoại lệ này xảy ra, trình thông dịch Python dừng quy trình hiện tại và chuyển nó cho quy trình gọi cho đến khi nó được xử lý. Nếu không được xử lý, chương trình sẽ bị sập.
Ví dụ, chúng ta hãy xem xét một chương trình mà chúng ta có một hàm A
gọi hàm B
, đến lượt nó sẽ gọi hàm C
. Nếu một ngoại lệ xảy ra trong hàm C
nhưng không được xử lý trong C
, thì ngoại lệ đó sẽ được chuyển đến B
rồi đến A
.
Nếu không bao giờ được xử lý, một thông báo lỗi sẽ hiển thị và chương trình của chúng tôi đột ngột dừng đột ngột.
Bắt ngoại lệ bằng Python
Trong Python, các ngoại lệ có thể được xử lý bằng một try
câu lệnh.
Hoạt động quan trọng có thể tạo ra một ngoại lệ được đặt bên trong try
mệnh đề. Mã xử lý các ngoại lệ được viết trong except
mệnh đề.
Do đó, chúng tôi có thể chọn những hoạt động để thực hiện khi chúng tôi đã bắt được ngoại lệ. Đây là một ví dụ đơn giản.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Đầu ra
Mục nhập là Rất tiếc! xảy ra. Mục tiếp theo. Mục nhập là 0 Rất tiếc! xảy ra. Mục tiếp theo. Mục nhập là 2 Số nghịch đảo của 2 là 0,5
Trong chương trình này, chúng tôi lặp qua các giá trị của danh sách randomList. Như đã đề cập trước đây, phần có thể gây ra ngoại lệ được đặt bên trong try
khối.
Nếu không có ngoại lệ nào xảy ra, except
khối sẽ bị bỏ qua và luồng bình thường tiếp tục (cho giá trị cuối cùng). Nhưng nếu có bất kỳ ngoại lệ nào xảy ra, nó sẽ bị chặn bởi except
khối (giá trị thứ nhất và thứ hai).
Ở đây, chúng tôi in tên của ngoại lệ bằng cách sử dụng exc_info()
hàm bên trong sys
mô-đun. Chúng ta có thể thấy rằng a
nguyên nhân ValueError
và 0
nguyên nhân ZeroDivisionError
.
Vì mọi ngoại lệ trong Python đều kế thừa từ Exception
lớp cơ sở , chúng ta cũng có thể thực hiện tác vụ trên theo cách sau:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Chương trình này có đầu ra tương tự như chương trình trên.
Bắt các ngoại lệ cụ thể trong Python
Trong ví dụ trên, chúng tôi đã không đề cập đến bất kỳ ngoại lệ cụ thể nào trong except
mệnh đề.
Đây không phải là một phương pháp lập trình tốt vì nó sẽ bắt tất cả các ngoại lệ và xử lý mọi trường hợp theo cùng một cách. Chúng ta có thể chỉ định ngoại lệ nào mà một except
mệnh đề phải bắt.
Một try
mệnh đề có thể có bất kỳ số except
mệnh đề nào để xử lý các ngoại lệ khác nhau, tuy nhiên, chỉ một mệnh đề sẽ được thực thi trong trường hợp ngoại lệ xảy ra.
Chúng ta có thể sử dụng một bộ giá trị để chỉ định nhiều ngoại lệ trong một mệnh đề ngoại trừ. Đây là một mã giả ví dụ.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Nâng cao ngoại lệ trong Python
Trong lập trình Python, các ngoại lệ được đưa ra khi lỗi xảy ra trong thời gian chạy. Chúng tôi cũng có thể tăng các ngoại lệ theo cách thủ công bằng cách sử dụng raise
từ khóa.
Chúng tôi có thể tùy chọn chuyển các giá trị cho ngoại lệ để làm rõ lý do tại sao ngoại lệ đó được đưa ra.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Python hãy thử với mệnh đề else
Trong một số tình huống, bạn có thể muốn chạy một khối mã nhất định nếu khối mã bên trong try
chạy mà không có bất kỳ lỗi nào. Đối với những trường hợp này, bạn có thể sử dụng else
từ khóa tùy chọn với try
câu lệnh.
Lưu ý : Các ngoại lệ trong mệnh đề else không được xử lý bởi các mệnh đề ngoại trừ trước đó.
Hãy xem một ví dụ:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Đầu ra
Nếu chúng ta vượt qua một số lẻ:
Nhập một số: 1 Không phải là số chẵn!
Nếu chúng ta chuyển một số chẵn, đối ứng sẽ được tính toán và hiển thị.
Nhập một số: 4 0,25
Tuy nhiên, nếu chúng ta vượt qua 0, chúng ta sẽ nhận được ZeroDivisionError
vì khối mã bên trong else
không được xử lý bằng phần trước except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Kiểu cấu trúc này đảm bảo rằng tệp được đóng ngay cả khi một ngoại lệ xảy ra trong quá trình thực thi chương trình.