“Thật khó để tìm ra lỗi trong mã của bạn khi bạn đang tìm kiếm nó; thậm chí còn khó hơn khi bạn cho rằng mã của mình không có lỗi.”
– Steve McConnell
Lỗi là điều không thể tránh khỏi trong cuộc sống của một lập trình viên. Trên thực tế, trong khi viết chương trình, lỗi có thể thực sự hữu ích trong việc xác định lỗi logic và lỗi cú pháp trong mã của bạn.
Tuy nhiên, nếu bạn có thể lường trước một lỗi trong một tập hợp các dòng mã cụ thể trước khi thực thi, thì bạn có thể xử lý các lỗi đó và làm cho mã không có lỗi.
Tại sao xử lý lỗi lại quan trọng
Xử lý hoặc xử lý các lỗi mà bạn biết sẽ giúp mã chạy và thực thi trơn tru mà không bị gián đoạn. Nếu xảy ra lỗi trong bất kỳ dòng mã nào, việc xử lý lỗi sẽ xử lý chúng và sau đó mã sẽ tiếp tục thực thi.
Hãy lấy một ví dụ và hiểu tại sao chúng ta cần xử lý lỗi:
a = 12
b = 6
result = a/b
print(result)
print("I have reached the end of the line")
Từ đoạn mã trên, bạn mong đợi điều gì?. Vâng, các result
in biến 2.0
và trên dòng tiếp theo, bảng điều khiển in I have reached the end of the line
. Đó là những gì chúng tôi đang ngoại trừ.
Hãy thay đổi giá trị của b
từ b = 6
đến b = 0
và chạy.
1. a = 12
2. b = 0
3. result = a/b
4. print(result)
5. print("I have reached the end of the line")
Khi mã này được thực thi, chúng tôi sẽ gặp lỗi như sau:
Mã không in result
giá trị và nó cũng không in I have reached the end of the line
Các thông báo lỗi trên hiển thị division by zero
có nghĩa là nếu chúng ta cố gắng chia bất kỳ số nào cho chúng ta sẽ gặp lỗi này.
Vấn đề là trong dòng 3
. Mặc dù mã không in result
giá trị, nó nên đã được in I have reached the end of the line
. Nhưng, nó đã không – tại sao?
Chà, bởi vì trình thông dịch Python dừng ở dòng 3 khi a
đã chia cho . Tại thời điểm này, nó đã báo lỗi trong bảng điều khiển và thoát khỏi mã.
Một trong những giải pháp ngây thơ để giải quyết vấn đề này có thể là mã hóa cứng các giá trị. Nếu các giá trị của a
và b
được mã hóa cứng, thì việc chạy mã sẽ giải quyết được lỗi này ở một mức độ nào đó.
Nhưng vấn đề lớn khác có thể phát sinh là khi người dùng muốn đưa ra các giá trị của a
và b
tại thời điểm thực hiện.
a = int(input())
b = int(input())
result = a/b
print(result)
print("I have reached the end of the line")
Tại thời điểm này, có khả năng cao là người dùng sẽ đưa ra làm đầu vào cho
b
. Để xử lý loại lỗi dự kiến này, chúng tôi sẽ sử dụng một số phương pháp xử lý lỗi nhất định để tránh làm gián đoạn luồng thực thi (mặc dù người dùng có thể cung cấp bất kỳ thông tin nhập không hợp lệ nào như làm đầu vào cho
b
).
Cách sử dụng Thử và loại trừ từ khóa trong Python
Bất kỳ dòng mã nào dễ bị lỗi hơn được giữ trong try
chặn. Nếu có bất kỳ lỗi nào xảy ra, thì except
block sẽ xử lý các lỗi đó.
Cấu trúc mã trông giống như thế này:
try:
code that may/may not produce errors
except:
when error arises, then this block of code exceutes.
Otherwise, this block of code doesn't exceute
Hãy quay lại ví dụ tiêu chuẩn mà chúng ta đã thảo luận. Chúng tôi sẽ xử lý division by zero
vấn đề sử dụng try/except
khối.
Hãy chèn các dòng mã có khả năng tạo ra lỗi cao. Trong trường hợp của chúng tôi, dòng 1-4
mã của chúng tôi có khả năng tạo ra lỗi cao. Vì vậy, chúng tôi đặt bốn dòng này trong try
chặn:
try:
a = int(input())
b = int(input())
result = a/b
print(result)
except:
print("We caught an error")
print("I have reached the end of the line")
Bây giờ, khi chúng ta cho b
một giá trị của , một lỗi xảy ra. Nên
except
khối thực thi và trình thông dịch in We caught an error
và ra khỏi khối ngoại trừ và tiếp tục in I have reached the end of the line
.
Mặt khác, khi chúng ta cho b
một giá trị khác không, sau đó chúng tôi in result
giá trị. Mã ra khỏi khối thử và tiếp tục in I have reached the end of the line
.
Trong cả hai trường hợp, chúng tôi có thể thực thi cho đến dòng mã cuối cùng mà không bị gián đoạn.
Ngoài thử và ngoại trừ, điều khá quan trọng là phải hiểu else
và finally
Từ khóa đi kèm với try
và except
.
Các else
khối mã xuất hiện sau try
và except
chặn và thực thi khi không có lỗi nào xuất hiện từ try
khối mã. Tương tự như vậy, các finally
khối mã xuất hiện sau else
chặn và thực thi cho dù có xảy ra lỗi hay không – khối này chắc chắn sẽ thực thi.
Bây giờ bạn đã hiểu làm thế nào các try
, except
, else
và finally
các khối mã hoạt động, thứ tự dòng chảy sẽ là:
try:
code that may/may not produce errors
except:
when error arises, then this block of code exceutes
else:
when error doesn't arise, then this block of code exceutes
finally:
This block will exceute whether error occurs or not.
Khi áp dụng cấu trúc tương tự cho bài toán chia số, ta có:
try:
a = int(input())
b = int(input())
result = a/b
print(result)
except:
print("We caught an error")
else:
print("Hurray, we don't have any errors")
finally:
print("I have reached the end of the line")
Khi nào b
được gán , sau đó chúng tôi nhận được một lỗi. Vì vậy, khối except thực thi và in
We caught an Error
và cuối cùng khối mã thực thi và in I have reached the end of the line
.
Mặt khác, nếu b
được 6
ví dụ (hoặc bất kỳ giá trị khác không), sau đó chúng tôi chia a
giá trị bằng 6
và lưu trữ nó trong result
Biến đổi. Mã này sau đó in result
giá trị.
Sau đó, else
khối thực thi và in Hurray, we don't have any errors
và cuối cùng khối mã thực thi và in I have reached the end of the line
.
Tóm lược
Bây giờ, tôi hy vọng bạn đã hiểu cách triển khai xử lý lỗi trong Python để phát hiện các lỗi tiềm ẩn với try/except
khối.
Bạn cũng đã học cách sử dụng else
và finally
các khối mã được liên kết với các phương pháp xử lý lỗi này.
Lập trình vui vẻ…