Ngoại lệ và cách xử lý ngoại lệ trong Python
Ngoại lệ trong Python là gì?
Ngoại lệ là một sự kiện, xảy ra trong quá trình thực thi chương trình làm gián đoạn luồng hướng dẫn bình thường của chương trình. Nói chung, khi một tập lệnh Python gặp một tình huống mà nó không thể đối phó, nó sẽ tạo ra một ngoại lệ. Một ngoại lệ trong Python là một đối tượng Python đại diện cho một lỗi.
Khi một tập lệnh Python tạo ra một ngoại lệ, nó phải xử lý ngoại lệ đó ngay lập tức nếu không nó sẽ kết thúc và thoát.
Ngay cả khi một câu lệnh hoặc biểu thức đúng về mặt cú pháp, nó vẫn có thể gây ra lỗi khi thực thi. Các lỗi được phát hiện trong quá trình thực thi được gọi là ngoại lệ .Tuy nhiên, hầu hết các trường hợp ngoại lệ không được chương trình xử lý và dẫn đến các thông báo lỗi như được hiển thị ở đây:
>>>
>>> 10 * (1/0)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
NameError: name ‘spam’ is not defined
>>> ‘2’ + 2
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: Can’t convert ‘int’ object to str implicitly
Dòng cuối cùng của thông báo lỗi cho lỗi gì đã xảy ra. Trường hợp ngoại lệ có nhiều kiểu (type) khác nhau, và các kiểu (type) lại được in như là một phần của thông điệp: các type trong ví dụ là ZeroDivisionError, NameError và TypeError. Phần còn lại của dòng cung cấp chi tiết dựa trên loại ngoại lệ và nguyên nhân gây ra nó.
Phần trước của thông báo lỗi hiển thị bối cảnh nơi ngoại lệ đã xảy ra, dưới dạng một dấu vết ngăn xếp. Nói chung, nó chứa một dòng nguồn liệt kê theo dõi ngăn xếp; tuy nhiên, nó sẽ không hiển thị các dòng được đọc từ đầu vào tiêu chuẩn.
Các ngoại lệ tích hợp sẵn sẽ liệt kê các ngoại lệ và ý nghĩa của chúng.
>>> Xem thêm: Hàm Lambda trong Python – Tìm hiểu về hàm ẩn danh Lambda
Cách xử lý ngoại lệ trong Python
Các bước xử lý ngoại lệ trong Python
Bạn có thể viết chương trình xử lý các ngoại lệ được chọn. Ở ví dụ dưới đây bạn sẽ thấy yêu cầu đưa ra là người dùng phải nhập một số nguyên hợp lệ. Tuy nhiên, chương trình cho phép người dùng sử dụng control hoặc bất kỳ công cụ nào hệ điều hành hỗ trợ để ngắt chương trình.
>>> while True:
… try:
… x = int(input(“Please enter a number: “))
… break
… except ValueError:
… print(“Oops! That was no valid number. Try again…”)
…
Đoạn code trên sẽ hoạt động như sau:
– Đầu tiên, mệnh đề try (các câu lệnh giữa khóa try và except) sẽ được thực thi
– Nếu ngoại lệ không xảy ra, mệnh đề Except sẽ bị bỏ qua về quá trình thực thi câu lệnh try sẽ kết thúc
– Nếu một ngoại lệ xảy ra trong quá trình thực hiện mệnh đề try, phần còn lại của mệnh đề sẽ bị bỏ qua. Sau đó, nếu type của nó khớp với ngoại lệ được đặt tên theo từ khóa except, mệnh đề ngoại trừ được thực thi và sau đó việc thực thi tiếp tục sau câu lệnh try.
– Nếu một ngoại lệ xảy ra mà không khớp với ngoại lệ có tên trong mệnh đề Ngoại trừ, nó được chuyển cho các câu lệnh try bên ngoài ; nếu không tìm thấy trình xử lý, nó là một ngoại lệ chưa được xử lý và việc thực thi sẽ dừng lại với một thông báo như được hiển thị ở trên.
Một câu lệnh try có thể có nhiều mệnh đề except được sử dụng để chỉ định các trình xử lý cho các ngoại lệ khác nhau. Bạn cần nhớ rằng các trình xử lý sẽ chỉ xử lý các ngoại lệ xảy ra trong mệnh đề try tương ứng mà không xử lý các ngoại lệ khác cùng câu lệnh try. Mệnh đề except có thể đặt tên cho nhiều ngoại lệ dưới dạng một bộ giá trị đặt trong dấu ngoặc đơn như sau:
… except (RuntimeError, TypeError, NameError):
… pass
Một lớp trong mệnh đề except sẽ tương thích với một ngoại lệ nếu nó cùng một lớp hoặc kế thừa từ một ngoại lệ. Một mệnh đề except sẽ chứa các lớp dẫn xuất không tương thích với lớp cơ sở.
>>>Tham khảo: Khóa học lập trình Python
Mệnh đề except không có ngoại lệ
Bạn có thể sử dụng cùng một mệnh đề except để xử lý nhiều ngoại lệ như dưới đây:
try:
You do your operations here;
………………….
except(Exception1[, Exception2[,…ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
………………….
else:
If there is no exception then execute this block.
Đối số của ngoại lệ trong Python
Một ngoại lệ có thể có đối số – là giá trị cung cấp thông tin bổ sung về vấn đề. Nội dung của đối số sẽ khác nhau tùy theo ngoại lệ. Bạn có thể lấy đối số của ngoại lệ bằng cách cung cấp một biến trong mệnh đề loại trừ như ví dụ dưới đây:
try:
You do your operations here;
………………….
except ExceptionType, Argument:
You can print value of Argument here…
Nếu bạn viết code để giải quyết một ngoại lệ đơn lẻ, bạn có thể có một biến theo sau tên cả ngoại lệ trong mệnh đề except. Biến này sẽ nhận giá trị của ngoại lệ chứa nguyên nhân dẫn đến ngoại lệ. Biến có thể nhận giá trị duy nhất hoặc nhiều giá trị dưới dạng một bố giá trị. Tuple này thường chứa chuỗi lỗi, số lỗi và vị trí lỗi.
Dưới đây là ví dụ về một ngoại lệ đơn:
#!/usr/bin/python
# Define a function here.
def temp_convert(var):
try:
return int(var)
except ValueError, Argument:
print “The argument does not contain numbersn”, Argument
# Call above function here.
temp_convert(“xyz”);
Kết quả nhận được sẽ như sau:
The argument does not contain numbers
invalid literal for int() with base 10: ‘xyz’
Nâng cao ngoại lệ trong Python
Bạn có thể nâng cao ngoại lệ bằng nhiều cách bằng việc sử dụng lệnh raise. Cú pháp chung cho lệnh raise là như sau:
raise [Exception [, args [, traceback]]]
Ở đây, Exception là loại ngoại lệ và đối số là giá trị cho đối số ngoại lệ. Đối số là tùy chọn và nếu nó không được cung cấp, đối số ngoại lệ sẽ là None.
Đối số cuối cùng, trace back cũng là đối số tùy chọn (hiếm khi được sử dụng trong thực tế) và nếu có, cũng là đối tượng traceback sử dụng cho ngoại lệ.
Ví dụ:
Một ngoại lệ có thể là một chuỗi, lớp hoặc đối tượng. Hầu hết các ngoại lệ mà core Python nêu ra là các lớp, với một đối số là một instance (thể hiện) của một lớp. Việc xác định các ngoại lệ mới khá dễ dàng và có thể thực hiện như sau:
if level < 1:
raise “Invalid level!”, level
# The code below to this would not be executed
# if we raise the exception
Chú ý: Để bắt một ngoại lệ, mệnh đề exception phải tham chiếu đến cùng một ngoại lệ được đưa ra. Ví dụ để bắt được ngoại lệ phía trên, bạn cần viết mệnh đề ngoại lệ như dưới đây:
try:
Business Logic here…
except “Invalid level!”:
Exception handling here…
else:
Rest of the code here…
Kết luận: Trên đây là các kiến thức căn bản về ngoại lệ, cú pháp của ngoại lệ cũng như một số ví dụ về việc xử lý ngoại lệ trong Python. Việc hiểu rõ ngoại lệ trong lập trình với Python là một việc cần thiết mà bất kỳ lập trình viên nào cũng nên tìm hiểu. Hy vọng những kiến thức trên đây có thể giúp ích cho các bạn trong quá trình làm việc với Python.
Nguồn tham khảo: docs.python; tutorialspoint