Python có thoát ngoại lệ không?

Các ứng dụng phần mềm không phải lúc nào cũng chạy hoàn hảo. Mặc dù gỡ lỗi chuyên sâu và nhiều cấp độ thử nghiệm, các ứng dụng vẫn bị lỗi. Dữ liệu xấu, kết nối mạng bị hỏng, cơ sở dữ liệu bị hỏng, áp lực bộ nhớ và đầu vào không mong muốn của người dùng đều có thể ngăn ứng dụng hoạt động bình thường. Khi một sự kiện như vậy xảy ra và ứng dụng không thể tiếp tục hoạt động bình thường, đây được gọi là ngoại lệ. Và công việc của ứng dụng của bạn—và công việc của bạn với tư cách là một lập trình viên—là nắm bắt và xử lý các ngoại lệ này một cách khéo léo để ứng dụng của bạn tiếp tục hoạt động

Cài đặt SDK Python để xác định và sửa lỗi ngoại lệ

Ngoại lệ Python là gì?

Các ngoại lệ trong các ứng dụng Python có thể xảy ra vì nhiều lý do đã nêu ở trên và hơn thế nữa; . Là nhà phát triển Python, bạn cần suy nghĩ về các tình huống ngoại lệ có thể xảy ra và bao gồm việc xử lý lỗi trong mã của mình

May mắn thay, Python đi kèm với một khung xử lý lỗi mạnh mẽ. Sử dụng xử lý ngoại lệ có cấu trúc và một tập hợp các ngoại lệ được xác định trước, các chương trình Python có thể xác định loại lỗi trong thời gian chạy và hành động tương ứng. Chúng có thể bao gồm các hành động như đi theo đường dẫn thay thế, sử dụng giá trị mặc định hoặc nhắc nhập chính xác

Bài viết này sẽ chỉ cho bạn cách tạo ngoại lệ trong mã Python của bạn và cách giải quyết các ngoại lệ

 

Sự khác biệt giữa Lỗi cú pháp Python và Ngoại lệ Python

Trước khi tìm hiểu sâu, điều quan trọng là phải hiểu hai loại điều kiện không mong muốn trong lập trình Python—lỗi cú pháp và ngoại lệ

Ngoại lệ lỗi cú pháp xảy ra khi mã không phù hợp với từ khóa Python, kiểu đặt tên hoặc cấu trúc lập trình. Trình thông dịch nhìn thấy cú pháp không hợp lệ trong giai đoạn phân tích cú pháp của nó và đưa ra một ngoại lệ SyntaxError. Chương trình dừng và lỗi tại điểm xảy ra lỗi cú pháp. Đó là lý do lỗi cú pháp là ngoại lệ không thể xử lý

Đây là một khối mã ví dụ có lỗi cú pháp (lưu ý không có dấu hai chấm sau điều kiện “nếu” trong ngoặc đơn)

a = 10
b = 20

if (a < b)
    print('a is less than b')

c = 30
print(c)

Thông dịch viên nhận lỗi và chỉ ra số dòng. Lưu ý cách nó không tiếp tục sau lỗi cú pháp

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1

Mặt khác, một ngoại lệ xảy ra khi mã không có lỗi cú pháp nhưng gặp các tình huống lỗi khác. Những điều kiện này có thể được xử lý trong mã—trong chức năng hiện tại hoặc trong ngăn xếp cuộc gọi. Theo nghĩa này, ngoại lệ không gây tử vong. Một chương trình Python có thể tiếp tục chạy nếu nó xử lý tốt ngoại lệ

Đây là một ví dụ về mã Python không có bất kỳ lỗi cú pháp nào. Nó đang cố chạy một phép toán số học trên hai biến chuỗi

a = 'foo'
b = 'bar'
print(a % b)

Ngoại lệ được đưa ra là TypeError

Traceback (most recent call last):
  File "test.py", line 4, in 
    print(a % b)
TypeError: not all arguments converted during string formatting

Process finished with exit code 1

Python ném ngoại lệ TypeError khi có kiểu dữ liệu sai. Tương tự như TypeError, có một số ngoại lệ tích hợp sẵn như

  1. ModuleNotFoundLỗi
  2. Nhập Lỗi
  3. Lỗi bộ nhớ
  4. Hệ điều hànhLỗi
  5. Lỗi hệ thống
  6. Và như thế

Bạn có thể tham khảo danh sách đầy đủ các trường hợp ngoại lệ

 

Cách ném ngoại lệ trong Python

Đôi khi bạn muốn Python đưa ra một ngoại lệ tùy chỉnh để xử lý lỗi. Bạn có thể làm điều này bằng cách kiểm tra một điều kiện và đưa ra ngoại lệ, nếu điều kiện là True. Ngoại lệ được nêu ra thường cảnh báo người dùng hoặc ứng dụng gọi điện

Bạn sử dụng từ khóa “raise” để ném ngoại lệ Python theo cách thủ công. Bạn cũng có thể thêm một thông báo để mô tả ngoại lệ

Đây là một ví dụ đơn giản. Giả sử bạn muốn người dùng nhập ngày. Ngày phải là hôm nay hoặc trong tương lai. Nếu người dùng nhập một ngày trong quá khứ, chương trình sẽ đưa ra một ngoại lệ

Ví dụ về ngoại lệ ném Python

from datetime import datetime

current_date = datetime.now()
print("Current date is: " + current_date.strftime('%Y-%m-%d'))

dateinput = input("Enter date in yyyy-mm-dd format: ")
# We are not checking for the date input format here
date_provided = datetime.strptime(dateinput, '%Y-%m-%d')
print("Date provided is: " + date_provided.strftime('%Y-%m-%d'))

if date_provided.date() < current_date.date():
    raise Exception("Date provided can't be in the past")

Để kiểm tra mã, chúng tôi nhập ngày cũ hơn ngày hiện tại. Điều kiện “nếu” đánh giá là đúng và đưa ra ngoại lệ

Current date is: 2021-01-24
Enter date in yyyy-mm-dd format: 2021-01-22
Date provided is: 2021-01-22
Traceback (most recent call last):
  File "test.py", line 13, in 
    raise Exception("Date provided can't be in the past")
Exception: Date provided can't be in the past

Process finished with exit code 1

Thay vì đưa ra một ngoại lệ chung chung, chúng ta cũng có thể chỉ định một loại cho nó

if (date_provided.date() < current_date.date()):
    raise ValueError("Date provided can't be in the past")

Với một đầu vào tương tự như trước đây, Python sẽ ném ngoại lệ này

raise ValueError("Date provided can't be in the past")
ValueError: Date provided can't be in the past

 

Sử dụng AssertionError trong Ném ngoại lệ Python

Một cách khác để đưa ra một ngoại lệ là sử dụng khẳng định. Với khẳng định, bạn khẳng định một điều kiện là đúng trước khi chạy câu lệnh. Nếu điều kiện đánh giá là đúng, câu lệnh sẽ chạy và điều khiển tiếp tục đến câu lệnh tiếp theo. Tuy nhiên, nếu điều kiện đánh giá là sai, chương trình sẽ đưa ra lỗi AssertionError. Sơ đồ dưới đây cho thấy luồng logic

Sử dụng AssertionError, chúng ta có thể viết lại đoạn mã ở phần cuối như thế này

________số 8_______

Lưu ý cách chúng tôi đã xóa điều kiện “nếu” và hiện đang khẳng định rằng ngày được cung cấp lớn hơn hoặc bằng ngày hiện tại. Khi nhập một ngày cũ hơn, AssertionError hiển thị

Current date is: 2021-01-24
Enter date in yyyy-mm-dd format: 2021-01-23
Traceback (most recent call last):
Date provided is: 2021-01-23
  File "test.py", line 12, in 
    assert(date_provided.date() >= current_date.date()), "Date provided can't be in the past"
AssertionError: Date provided can't be in the past

Process finished with exit code 1

 

Bắt ngoại lệ Python bằng Try-Exception

Bây giờ bạn đã hiểu cách ném ngoại lệ trong Python theo cách thủ công, đã đến lúc xem cách xử lý các ngoại lệ đó. Hầu hết các ngôn ngữ lập trình hiện đại đều sử dụng cấu trúc gọi là “try-catch” để xử lý ngoại lệ. Với Python, hình thức cơ bản của nó là “try-except”. Khối try-ngoại trừ trông như thế này

Python Try Catch Ví dụ ngoại lệ

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
0

Tại đây, luồng chương trình đi vào khối “thử”. Nếu có ngoại lệ, điều khiển sẽ nhảy tới mã trong khối “ngoại trừ”. Mã xử lý lỗi bạn đặt trong khối “ngoại trừ” tùy thuộc vào loại lỗi mà bạn cho rằng mã trong khối “thử” có thể gặp phải

Đây là một ví dụ về “try-except” của Python (thường được gọi nhầm là “try-catch-Exception”). Giả sử chúng ta muốn mã của mình chỉ chạy nếu phiên bản Python là 3. Sử dụng một xác nhận đơn giản trong mã trông như thế này

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
1

Nếu phiên bản Python không phải là 3, thông báo lỗi sẽ như thế này

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
2

Thay vì để chương trình thất bại với một ngoại lệ chưa được xử lý và hiển thị thông báo lỗi xấu xí, chúng ta có thể sử dụng khối try-ngoại trừ để thoát một cách dễ dàng

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
3

Bây giờ, thông báo lỗi sạch hơn nhiều

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
4

Từ khóa “ngoại trừ” trong cấu trúc cũng chấp nhận loại lỗi bạn muốn xử lý. Để minh họa điều này, hãy quay lại tập lệnh ngày của chúng ta từ phần trước. Trong tập lệnh đó, chúng tôi giả định rằng người dùng sẽ nhập ngày ở định dạng “YYYY-MM-DD”. Tuy nhiên, với tư cách là nhà phát triển, bạn nên xử lý bất kỳ loại dữ liệu sai sót nào thay vì phụ thuộc vào người dùng. Ví dụ, một số tình huống ngoại lệ có thể được

  1. Không có ngày nhập (trống)
  2. Văn bản đã nhập
  3. Số đã nhập
  4. Thời gian đã nhập
  5. Các ký tự đặc biệt đã nhập
  6. Đã nhập định dạng ngày khác (chẳng hạn như “dd/mm/yyyy”)

Để giải quyết tất cả các điều kiện này, chúng ta có thể viết lại khối mã như hình bên dưới. Điều này sẽ bắt bất kỳ ngoại lệ ValueError nào được nêu ra khi đáp ứng bất kỳ điều kiện nào ở trên

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
5

Trong trường hợp này, chương trình sẽ thoát nhanh nếu ngày không được định dạng chính xác

Bạn có thể bao gồm nhiều khối “ngoại trừ” cho khối “thử” để bẫy các loại ngoại lệ khác nhau. Mỗi khối "ngoại trừ" sẽ giải quyết một loại lỗi cụ thể

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
6

Đây là một ví dụ rất đơn giản

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
7

Chúng tôi có thể kiểm tra chương trình này với các giá trị khác nhau

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
8

 

Bắt ngoại lệ Python bằng Try-Exception-Else

Phần tử tiếp theo trong cấu trúc “try-except” của Python là “else”

Python Thử ngoại trừ ví dụ khác

File "test.py", line 4
    if (a < b)
             ^
SyntaxError: invalid syntax

Process finished with exit code 1
9

Khối “else” chạy nếu không có ngoại lệ nào được đưa ra từ khối “try”. Nhìn vào cấu trúc mã ở trên, bạn có thể thấy cách xử lý ngoại lệ “else” trong Python hoạt động gần giống như cấu trúc “if-else”

Để hiển thị cách hoạt động của “else”, chúng ta có thể sửa đổi một chút mã của tập lệnh số học từ phần trước. Nếu bạn nhìn vào tập lệnh, bạn sẽ thấy chúng tôi đã tính giá trị biến của “kết quả” bằng biểu thức số học. Thay vì đặt cái này vào khối “thử”, bạn có thể chuyển nó sang khối “khác”. Bằng cách đó, ngoại lệ sẽ chặn bất kỳ lỗi nào phát sinh trong khi chuyển đổi giá trị đầu vào thành số nguyên. Và nếu không có ngoại lệ, khối “else” sẽ thực hiện phép tính thực tế

a = 'foo'
b = 'bar'
print(a % b)
0

Sử dụng các số nguyên đơn giản làm giá trị đầu vào chạy mã khối “else”

a = 'foo'
b = 'bar'
print(a % b)
1

Và việc sử dụng dữ liệu sai như giá trị trống, số thập phân hoặc chuỗi khiến khối “ngoại trừ” tương ứng chạy và bỏ qua khối “khác”

a = 'foo'
b = 'bar'
print(a % b)
2

Tuy nhiên, vẫn có khả năng xảy ra các trường hợp ngoại lệ chưa được xử lý khi khối “else” chạy

a = 'foo'
b = 'bar'
print(a % b)
3

Như bạn có thể thấy, cả hai đầu vào đều là số nguyên (1 và 0) và khối “thử” chuyển đổi thành công chúng thành số nguyên. Khi khối “else” chạy, chúng ta thấy ngoại lệ

Vậy làm thế nào để bạn xử lý các lỗi trong khối “else”?

a = 'foo'
b = 'bar'
print(a % b)
4

 

Bắt ngoại lệ Python bằng Try-Except-Else-Cuối cùng

Cuối cùng, chúng ta có khối tùy chọn cuối cùng trong xử lý lỗi Python. Và nó được gọi theo nghĩa đen là “cuối cùng”

Python Thử cuối cùng Ví dụ

a = 'foo'
b = 'bar'
print(a % b)
5

Khối “cuối cùng” chạy cho dù mã của khối “thử” có phát sinh ngoại lệ hay không. Nếu có ngoại lệ, mã trong khối “ngoại trừ” tương ứng sẽ chạy và sau đó mã trong khối “cuối cùng” sẽ chạy. Nếu không có ngoại lệ, mã trong khối “else” sẽ chạy (nếu có khối “else”), và sau đó mã trong khối “cuối cùng” sẽ chạy

Vì mã trong khối “cuối cùng” luôn chạy, nên bạn muốn giữ mã “dọn sạch” của mình ở đây, chẳng hạn như

  1. Viết thông báo trạng thái vào tệp nhật ký
  2. Đặt lại bộ đếm, danh sách, mảng
  3. Đóng các tệp đang mở
  4. Đóng kết nối cơ sở dữ liệu
  5. Đặt lại biến đối tượng
  6. Ngắt kết nối khỏi tài nguyên mạng
  7. Và như thế

Đây là một ví dụ về việc sử dụng "cuối cùng"

a = 'foo'
b = 'bar'
print(a % b)
6

Ở đây, khối “thử” cố gắng mở một tệp để đọc. Nếu tệp không tồn tại, khối ngoại lệ sẽ hiển thị thông báo cảnh báo, tạo tệp và thêm giá trị tĩnh là “2” vào tệp. Nếu tệp tồn tại, khối “else” sẽ đọc dòng đầu tiên của nội dung và in ra. Cuối cùng, khối “cuối cùng” đóng tệp. Điều này xảy ra cho dù tệp ban đầu có tồn tại hay không

Những gì chúng ta đã thảo luận cho đến nay có thể được tóm tắt trong sơ đồ dưới đây

Python có thoát ngoại lệ không?

 

Cách Rollbar có thể giúp ghi nhật ký và theo dõi lỗi Python

Rollbar là một nền tảng cải tiến mã liên tục cho các nhóm phát triển phần mềm. Nó cung cấp một cách tự động để nắm bắt các lỗi Python và các bài kiểm tra không thành công trong thời gian thực từ tất cả các lớp ngăn xếp ứng dụng và trên tất cả các môi trường. Điều này cho phép tạo phản hồi chủ động và tự động đối với các lỗi ứng dụng. Sơ đồ dưới đây cho thấy Rollbar hoạt động như thế nào

Rollbar hoạt động tự nhiên với nhiều ngôn ngữ lập trình và khung, bao gồm cả Python. Các nhà phát triển Python có thể cài đặt pyrollbar, SDK của Rollbar cho Python, sử dụng một công cụ như pip, nhập lớp Rollbar vào mã và gửi các ngoại lệ Python tới Rollbar. Đoạn mã dưới đây cho thấy nó dễ dàng như thế nào

a = 'foo'
b = 'bar'
print(a % b)
7

Theo dõi, phân tích và quản lý lỗi với Rollbar

Python có thoát ngoại lệ không?

Quản lý lỗi và ngoại lệ trong mã của bạn là một thách thức. Nó có thể làm cho việc triển khai mã sản xuất trở thành một trải nghiệm đáng sợ. Khả năng theo dõi, phân tích và quản lý lỗi trong thời gian thực có thể giúp bạn tiến hành một cách tự tin hơn. Rollbar tự động theo dõi và xử lý lỗi, giúp việc sửa lỗi trở nên dễ dàng hơn bao giờ hết. Thử nó ngay hôm nay

Python có thoát sau ngoại lệ không?

Một chương trình Python sẽ kết thúc ngay khi gặp lỗi . Trong Python, lỗi có thể là lỗi cú pháp hoặc ngoại lệ.

Ngoại lệ có dừng thực thi không?

Khi ném ngoại lệ, phương thức sẽ dừng thực thi ngay sau câu lệnh "ném" . Bất kỳ câu lệnh nào sau câu lệnh "ném" đều không được thực thi.

Điều gì xảy ra sau ngoại lệ trong Python?

Nếu một ngoại lệ xảy ra trong khi thực hiện mệnh đề try, phần còn lại của mệnh đề sẽ bị bỏ qua. Sau đó, nếu loại của nó khớp với ngoại lệ được đặt tên theo từ khóa ngoại trừ, mệnh đề ngoại trừ được thực thi và sau đó quá trình thực thi tiếp tục sau khối thử/ngoại trừ .

Mã thoát mặc định trên ngoại lệ trong Python là gì?

0 nếu trình thông dịch thoát bình thường (i. e. , không có ngoại lệ), 1 nếu trình thông dịch thoát do có ngoại lệ hoặc 2 nếu danh sách tham số không đại diện cho một dòng lệnh Python hợp lệ.