HomeLập trìnhPythonCác câu lệnh...

Các câu lệnh thử và ngoại trừ trong Python – Cách xử lý các ngoại lệ trong Python


Khi viết mã bằng Python, bạn thường có thể đoán trước các lỗi thời gian chạy ngay cả trong một chương trình đúng về mặt cú pháp và logic. Những lỗi này có thể do đầu vào không hợp lệ hoặc một số đoán trước được mâu thuẫn.

Trong Python, bạn có thể sử dụng tryexcept các khối để xử lý hầu hết các lỗi này như ngoại lệ đều duyên dáng hơn.

Trong hướng dẫn này, bạn sẽ học cú pháp chung của tryexcept. Sau đó, chúng ta sẽ tiến hành mã hóa các ví dụ đơn giản, thảo luận về những gì có thể sai và cung cấp các biện pháp khắc phục bằng cách sử dụng tryexcept khối.

Cú pháp của Python Thử và loại trừ các khối

Hãy bắt đầu bằng cách hiểu cú pháp của tryexcept câu lệnh trong Python. Mẫu chung được hiển thị bên dưới:

try:
	# There can be errors in this block
    
except <error type>:
	# Do this to handle exception;
	# executed if the try block throws an error
    
else:
	# Do this if try block executes successfully without errors
   
finally:
	# This block is always executed

Hãy xem những khối khác nhau được sử dụng để làm gì:

  • Các try khối là khối câu lệnh mà bạn muốn thử thực hiện. Tuy nhiên, có thể có lỗi thời gian chạy do một ngoại lệ và khối này có thể không hoạt động như dự định.
  • Các except khối được kích hoạt khi try khối không thành công do một ngoại lệ. Nó chứa một tập hợp các tuyên bố thường cung cấp cho bạn một số ngữ cảnh về những gì đã xảy ra bên trong try chặn.
  • Bạn nên luôn luôn đề cập đến loại của lỗi mà bạn định bắt làm ngoại lệ bên trong except khối, được biểu thị bằng trình giữ chỗ <error type> trong đoạn trích trên.
  • Bạn cũng có thể sử dụng except mà không chỉ định <error type>. Tuy nhiên, đây không phải là một phương pháp được khuyến nghị vì bạn không tính đến các loại lỗi khác nhau có thể xảy ra.

Khi cố gắng thực thi mã bên trong try chặn, cũng có khả năng xảy ra nhiều lỗi.

Ví dụ: bạn có thể đang truy cập một danh sách bằng chỉ mục nằm ngoài phạm vi, sử dụng khóa từ điển sai và cố mở một tệp không tồn tại – tất cả đều nằm trong try chặn.

Trong trường hợp này, bạn có thể gặp phải IndexError, KeyErrorFileNotFoundError. Và bạn phải thêm bao nhiêu except chặn dưới dạng số lượng lỗi mà bạn dự đoán, một lỗi cho từng loại lỗi.

  • Các else khối chỉ được kích hoạt nếu try khối được thực thi mà không có lỗi. Điều này có thể hữu ích khi bạn muốn thực hiện hành động tiếp theo khi try chặn thành công. Ví dụ: nếu bạn thử mở một tệp thành công, bạn có thể muốn đọc nội dung của tệp đó.
  • Các finally khối luôn được thực thi, bất kể điều gì xảy ra trong các khối khác. Điều này hữu ích khi bạn muốn giải phóng tài nguyên sau khi thực thi một khối mã cụ thể.

Ghi chú: Các elsefinally khối là không bắt buộc. Trong hầu hết các trường hợp, bạn chỉ có thể sử dụng try khối để thử làm điều gì đó và bắt lỗi dưới dạng ngoại lệ bên trong except chặn.

Trong vài phút tới, bạn sẽ sử dụng những gì đã học để xử lý các ngoại lệ trong Python. Bắt đầu nào.

Đọc thêm  SyntaxError EOF không mong muốn trong khi phân tích lỗi Python [Solved]

Làm thế nào để xử lý một ZeroDivisionError trong Python

Xem xét chức năng divide() hiển thị bên dưới. Phải mất hai đối số – numdiv – và trả về thương của phép chia num/div.

def divide(num,div):
  return num/div

▶ Gọi hàm với các số khác nhau sẽ trả về kết quả như mong đợi:

res = divide(100,8)
print(res)

# Output
12.5

res = divide(568,64)
print(res)

# Output
8.875

Mã này hoạt động tốt cho đến khi bạn thử chia cho 0:

divide(27,0)

Bạn thấy rằng chương trình gặp sự cố ném một ZeroDivisionError:

# Output
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-19-932ea024ce43> in <module>()
----> 1 divide(27,0)

<ipython-input-1-c98670fd7a12> in divide(num, div)
      1 def divide(num,div):
----> 2   return num/div

ZeroDivisionError: division by zero

Bạn có thể xử lý phép chia này cho 0 như một ngoại lệ bằng cách thực hiện như sau:

  • bên trong try chặn, thực hiện cuộc gọi đến divide() chức năng. Về bản chất, bạn đang cố gắng phân chia num qua div.
  • Xử lý trường hợp khi div như một ngoại lệ bên trong except chặn.
  • Trong ví dụ này, bạn có thể ngoại trừ ZeroDivisionError bằng cách in một thông báo thông báo cho người dùng rằng họ đã thử chia cho 0.

Điều này được hiển thị trong đoạn mã dưới đây:

try:
    res = divide(num,div)
    print(res)
except ZeroDivisionError:
    print("You tried to divide by zero :( ")

Với một đầu vào hợp lệ, mã vẫn hoạt động tốt.

divide(10,2)
# Output
5.0

Khi bạn cố gắng giảm xuống 0, bạn sẽ được thông báo về ngoại lệ xảy ra và chương trình kết thúc một cách duyên dáng.

divide(10,0)
# Output
You tried to divide by zero :(

Làm thế nào để xử lý một TypeError trong Python

Trong phần này, bạn sẽ thấy cách bạn có thể sử dụng tryexcept để xử lý một TypeError trong Python.

▶ Xét hàm sau add_10() lấy một số làm đối số, thêm 10 vào số đó và trả về kết quả của phép cộng này.

def add_10(num):
  return num + 10

Bạn có thể gọi hàm add_10() với bất kỳ số nào và nó sẽ hoạt động tốt, như hình bên dưới:

result = add_10(89)
print(result)

#Output
99

Bây giờ hãy thử gọi add_10() với "five" thay vì 5.

add_10("five")

Bạn sẽ nhận thấy rằng chương trình của bạn gặp sự cố với thông báo lỗi sau:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-15-9844e949c84e> in <module>()
----> 1 add_10("five")

<ipython-input-13-2e506d74d919> in add_10(num)
      1 def add_10(num):
----> 2   return num + 10

TypeError: can only concatenate str (not "int") to str

Thông báo lỗi TypeError: can only concatenate str (not "int") to str giải thích rằng bạn chỉ có thể nối hai chuỗi chứ không thể thêm số nguyên vào chuỗi.

Bây giờ, bạn có những điều sau đây:

  • Cho một số my_num, cố gắng gọi chức năng add_10() với my_num như lập luận. Nếu đối số là loại hợp lệ, không có ngoại lệ
  • Nếu không except khối tương ứng với TypeError được kích hoạt, thông báo cho người dùng rằng đối số thuộc loại không hợp lệ.
Đọc thêm  đối tượng 'int' không thể đăng ký [Solved Python Error]

Điều này được giải thích dưới đây:

my_num = "five"
try:
  result = add_10(my_num)
  print(result)
except TypeError:
  print("The argument `num` should be a number")

Vì bây giờ bạn đã xử lý TypeError như một ngoại lệ, bạn chỉ được thông báo rằng đối số thuộc loại không hợp lệ.

The argument `num` should be a number

Làm thế nào để xử lý một IndexError trong Python

Nếu bạn đã từng làm việc với các danh sách Python hoặc bất kỳ Python iterable nào trước đây, có thể bạn sẽ gặp phải IndexError.

Điều này là do thường khó theo dõi tất cả các thay đổi đối với các lần lặp. Và bạn có thể đang cố truy cập một mục tại một chỉ mục không hợp lệ.

▶ Trong ví dụ này, danh sách my_list có 4 mục. Các chỉ số hợp lệ là 0, 1, 2 và 3 và -1, -2, -3, -4 nếu bạn sử dụng chỉ mục phủ định.

Như 2 là một chỉ mục hợp lệ, bạn sẽ thấy rằng mục tại chỉ mục 2đó là C++được in ra:

my_list = ["Python","C","C++","JavaScript"]
print(my_list[2])

#Output
C++

Nếu bạn thử truy cập một mục tại chỉ mục nằm ngoài phạm vi chỉ mục hợp lệ, bạn sẽ gặp phải IndexError:

print(my_list[4])
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-7-437bc6501dea> in <module>()
      1 my_list = ["Python","C","C++","JavaScript"]
----> 2 print(my_list[4])

IndexError: list index out of range

Nếu bạn đã quen thuộc với mẫu này, bây giờ bạn sẽ sử dụng tryexcept để xử lý các lỗi chỉ mục.

▶ Trong đoạn mã bên dưới, bạn thử truy cập vào mục tại chỉ mục được chỉ định bởi search_idx.

search_idx = 3
try:
  print(my_list[search_idx])
except IndexError:
  print("Sorry, the list index is out of range")

Ở đây, search_idx (3) là một chỉ mục hợp lệ và mục tại chỉ mục cụ thể được in ra:

JavaScript

Nếu search_idx nằm ngoài phạm vi hợp lệ cho các chỉ mục, khối except bắt IndexError như một ngoại lệ và không còn thông báo lỗi dài nữa. 🙂

search_idx = 4
try:
  print(my_list[search_idx])
except IndexError:
  print("Sorry, the list index is out of range")

Thay vào đó, thông điệp rằng search_idx nằm ngoài phạm vi chỉ số hợp lệ được hiển thị:

Sorry, the list index is out of range

Làm thế nào để xử lý một KeyError trong Python

Bạn có khả năng gặp phải KeyError khi làm việc với từ điển Python

▶ Xem xét ví dụ này khi bạn có một từ điển my_dict.

my_dict ={"key1":"value1","key2":"value2","key3":"value3"}
search_key = "non-existent key"
print(my_dict[search_key])
  • Từ điển my_dict có 3 cặp khóa-giá trị, "key1:value1", "key2:value2""key3:value3"
  • Bây giờ, bạn thử gõ vào từ điển và truy cập giá trị tương ứng với khóa "non-existent key".

Theo dự kiến, bạn sẽ nhận được một KeyError:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-2-2a61d404be04> in <module>()
      1 my_dict ={"key1":"value1","key2":"value2","key3":"value3"}
      2 search_key = "non-existent key"
----> 3 my_dict[search_key]

KeyError: 'non-existent key'

Bạn có thể xử lý KeyError gần giống như cách bạn xử lý IndexError.

  • Bạn có thể thử truy cập giá trị tương ứng với khóa được chỉ định bởi search_key.
  • Nếu search_key thực sự là một khóa hợp lệ, giá trị tương ứng được in ra.
  • Nếu bạn gặp phải một ngoại lệ do khóa không tồn tại, bạn sử dụng except chặn để cho người dùng biết.

Điều này được giải thích trong đoạn mã dưới đây:

try:
  print(my_dict[search_key])
except KeyError:
  print("Sorry, that's not a valid key!")
Sorry, that's not a valid key!

▶ Nếu bạn muốn cung cấp ngữ cảnh bổ sung chẳng hạn như tên của khóa không hợp lệ, bạn cũng có thể làm điều đó. Có thể khóa đã bị viết sai chính tả khiến nó không hợp lệ. Trong trường hợp này, việc cho người dùng biết khóa được sử dụng có thể sẽ giúp họ sửa lỗi đánh máy.

Đọc thêm  Python Nhận phần tử cuối cùng trong danh sách – Cách chọn mục cuối cùng

Bạn có thể làm điều này bằng cách bắt khóa không hợp lệ như <error_msg> và sử dụng nó trong thông báo được in khi ngoại lệ xảy ra:

try:
  print(my_dict[search_key])
except KeyError as error_msg:
  print(f"Sorry,{error_msg} is not a valid key!")

▶ Lưu ý cách tên của khóa cũng được in ra:

Sorry,'non-existent key' is not a valid key!

Làm thế nào để xử lý một FileNotFoundError trong Python

Một lỗi phổ biến khác xảy ra khi làm việc với các tệp trong Python là FileNotFoundError.

▶ Trong ví dụ sau, bạn đang cố mở tệp my_file.txt bằng cách chỉ định đường dẫn của nó đến chức năng open(). Và bạn muốn đọc tệp và in ra nội dung của tệp.

Tuy nhiên, bạn chưa tạo tệp ở vị trí đã chỉ định.

Nếu bạn thử chạy đoạn mã bên dưới, bạn sẽ nhận được một FileNotFoundError:

my_file = open("/content/sample_data/my_file.txt")
contents = my_file.read()
print(contents)
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
<ipython-input-4-4873cac1b11a> in <module>()
----> 1 my_file = open("my_file.txt")

FileNotFoundError: [Errno 2] No such file or directory: 'my_file.txt'

Và sử dụng tryexceptbạn có thể làm như sau:

  • Hãy thử mở tệp trong try chặn.
  • Xử lý FileNotFoundError bên trong except chặn bằng cách cho người dùng biết rằng họ đã cố mở một tệp không tồn tại.
  • Nếu try chặn thành công và tệp tồn tại, hãy đọc và in ra nội dung của tệp.
  • bên trong finally chặn, đóng tệp để không lãng phí tài nguyên. Nhớ lại cách tệp sẽ được đóng bất kể điều gì xảy ra trong các bước mở và đọc tệp.
try:
  my_file = open("/content/sample_data/my_file.txt")
except FileNotFoundError:
  print(f"Sorry, the file does not exist")
else:
  contents = my_file.read()
  print(contents)
finally:
  my_file.close()

Lưu ý cách bạn đã xử lý lỗi như một ngoại lệ và chương trình kết thúc một cách duyên dáng với thông báo bên dưới:

Sorry, the file does not exist

▶ Hãy xem xét trường hợp trong đó else khối được kích hoạt. Tập tin my_file.txt hiện có mặt tại con đường đã đề cập trước đó.

hình ảnh-77

Và đây là những gì các tập tin my_file.txt chứa:

hình ảnh-78

Bây giờ, chạy lại đoạn mã trước đó hoạt động như mong đợi.

Lần này, tập tin my_file.txt có mặt, các else khối được kích hoạt và nội dung của nó được in ra, như hình dưới đây:

hinh-80

Tôi hy vọng điều này làm rõ cách bạn có thể xử lý các trường hợp ngoại lệ khi làm việc với tệp.

Phần kết luận

Trong hướng dẫn này, bạn đã học cách sử dụng tryexcept các câu lệnh trong Python để xử lý các ngoại lệ.

Bạn đã mã hóa các ví dụ để hiểu loại ngoại lệ nào có thể xảy ra và cách bạn có thể sử dụng except để nắm bắt các lỗi phổ biến nhất.

Hy vọng bạn thích hướng dẫn này. Chúc mừng mã hóa! Cho đến lần sau 🙂



Zik.vn – Biên dịch & Biên soạn Lại

spot_img

Create a website from scratch

Just drag and drop elements in a page to get started with Newspaper Theme.

Buy Now ⟶

Bài viết liên quang

DMCA.com Protection Status