Python thử cho đến khi thành công

Là một lập trình viên Python, bạn có thể gặp một ngoại lệ—dù bạn có nhận ra hay không. Nếu bạn cố chạy tập lệnh có lỗi cú pháp, Python sẽ đưa ra một ngoại lệ. Để trở thành một lập trình viên thành công, bạn sẽ phải học cách xử lý những lỗi này khi chúng phát sinh

Trong bài viết này, chúng ta sẽ tìm hiểu về các từ khóa

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 của Python và cách chúng được sử dụng để xử lý các trường hợp ngoại lệ. Chúng tôi sẽ hiển thị một ví dụ về các mệnh đề xử lý ngoại lệ, tìm hiểu thêm về trình quản lý ngữ cảnh cho các ngoại lệ và chỉ ra cách xử lý các ngoại lệ trong yêu cầu API.  

Ngoại lệ là gì?

Trong ngôn ngữ lập trình Python, một ngoại lệ [viết tắt của sự kiện đặc biệt] là một lỗi được phát hiện trong quá trình thực thi. Python đưa ra một ngoại lệ bất cứ khi nào bạn cố gắng chia cho 0, truy cập cơ sở dữ liệu không phản hồi hoặc thụt lề mã của bạn không đúng cách, trong số các tình huống khác

Các ngoại lệ cũng là các đối tượng bắt nguồn từ lớp lõi Python

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
1. Đối tượng
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
1 chứa thông tin về bản chất của lỗi trong mã của bạn. Python cung cấp một số ngoại lệ tích hợp sẵn và các thư viện có thể tự do mở rộng lớp
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
1 để triển khai lớp ngoại lệ của riêng chúng

Ngoại lệ trong Python

Chúng tôi sử dụng các từ khóa 

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 để nắm bắt hoặc xử lý các trường hợp ngoại lệ. Bắt ngoại lệ là rất quan trọng, vì các ngoại lệ không được bắt sẽ khiến chương trình của bạn gặp sự cố

Với ý nghĩ đó, chúng ta hãy xem xét một số ngoại lệ phổ biến trong Python

Ngoại lệ Python phổ biến

Python đi kèm với khá nhiều ngoại lệ tích hợp mà nó phát sinh đối với các tình trạng lỗi phổ biến. Dưới đây là những ngoại lệ mà bạn sẽ thường thấy nhất khi bắt đầu làm việc với Python

Tên ngoại lệDescriptionAssertErrorMột ngoại lệ được đưa ra khi một xác nhận không thành công. Thường được sử dụng để gỡ lỗi và kiểm tra đơn vị. KeyErrorMột ngoại lệ được đưa ra khi Python không thể tìm thấy khóa đã cho trong đối tượng từ điển. MemoryErrorNgoại lệ Python được đưa ra khi chương trình của bạn hết bộ nhớ khả dụng. ModuleNotFoundErrorMột ngoại lệ mà Python phát sinh khi không thể tìm thấy mô-đun đã chỉ định trong câu lệnh
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
6. NameErrorMột ngoại lệ mà Python phát sinh khi một biến không xác định được sử dụng. OSErrorMột nhóm các ngoại lệ tương tự được đưa ra khi hệ điều hành máy tính của bạn gặp lỗi. RuntimeErrorMột ngoại lệ linh tinh được đưa ra khi không áp dụng ngoại lệ Python tích hợp nào khác. StopIterationMột ngoại lệ được đưa ra khi bạn gọi next[] trên một trình vòng lặp, nhưng không còn đối tượng nào trong danh sách để lặp qua. SyntaxErrorMột ngoại lệ Python được đưa ra khi có vấn đề với cú pháp mã của bạn. TabErrorMột ngoại lệ được đưa ra khi mã của bạn có thụt lề không chính xác. TypeErrorNgoại lệ Python được đưa ra khi một đối tượng thuộc loại dữ liệu không chính xác cho một hoạt động nhất định. ZeroDivisionError Ngoại lệ được đưa ra khi bạn cố chia một số cho 0

Để biết thêm các ngoại lệ Python, hãy xem tài liệu ngoại lệ của Python. Lưu ý rằng mỗi thư viện thực hiện các ngoại lệ của riêng nó, vì vậy bạn có thể sẽ gặp các ngoại lệ khác với các ngoại lệ được tìm thấy trong sách hướng dẫn Python

Tiếp theo, hãy tạo một ngoại lệ chưa được phát hiện và xem Python xử lý nó như thế nào

Ví dụ ngoại lệ chưa được bắt

Trước khi chúng tôi bắt đầu xử lý lỗi với thử và ngoại trừ, hãy xem điều gì sẽ xảy ra khi mã của bạn gây ra ngoại lệ chưa được phát hiện. Ví dụ, hãy xem xét điều gì sẽ xảy ra nếu bạn chia một số nguyên cho 0. Chúng tôi sẽ chạy mã này

answer = 50 / 0
print[answer]

Trong toán học, bất kỳ số nào chia cho 0 đều dẫn đến kết quả không xác định. Trong Python, đây là những gì chúng tôi nhận được

Nhớ lại rằng khi đạt đến một ngoại lệ, Python dừng thực thi chương trình trên dòng nơi nó xảy ra. Quá trình thực thi không bao giờ đến được câu lệnh in và thay vào đó, chương trình của chúng tôi gặp sự cố

Bây giờ hãy xem cách chúng ta có thể bắt ngoại lệ và xử lý nó

Xử lý ngoại lệ với Từ khóa thử và ngoại trừ của Python

Chúng tôi biết rằng các lỗi chưa được phát hiện khiến chương trình của chúng tôi gặp sự cố, vì vậy bước tiếp theo là tìm hiểu cách phát hiện và xử lý các ngoại lệ. Chúng tôi sẽ sử dụng các từ khóa Python

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 để tạo các khối mã có thể bắt ngoại lệ

Một khối hoặc mệnh đề

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 chứa các chức năng và mã có thể đưa ra một ngoại lệ. Mệnh đề
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 chứa logic để xử lý ngoại lệ. Hãy xây dựng trên đoạn mã trước đó của chúng tôi và thêm
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0

Trong ví dụ này, trước tiên chúng ta sẽ xác định biến

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
03, sau đó cố gắng sử dụng nó để lưu trữ kết quả của phép toán chia cho 0. Cuối cùng, chúng tôi sẽ in câu trả lời và xem liệu nó là
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
04 hay nó có chứa kết quả. Hãy xem mã

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]

Lần này chúng tôi kết thúc hoạt động phân chia xấu số của mình trong một mệnh đề

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8. Mệnh đề ngoại trừ của chúng tôi chứa một câu lệnh in để cho chúng tôi biết rằng nó đã bắt gặp một ngoại lệ. Cuối cùng, chúng tôi in
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
03. Đây là kết quả chúng tôi nhận được từ việc chạy mã của mình

Như bạn có thể thấy, ngoại lệ đã được bắt gặp trong khối thử, biến

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
03 vẫn không bị ảnh hưởng và chương trình không gặp sự cố. Để hiểu rõ vấn đề, hãy thử lại cùng một mã, lần này chia cho hai thay vì không

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0

Chúng tôi sẽ chạy mã và xem đầu ra

Lần này mã trong khối

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 của chúng tôi không bao giờ chạy, vì vậy chúng tôi biết rằng không có ngoại lệ. Chúng tôi nhận được kết quả mong đợi.  

Sử dụng Trình quản lý bối cảnh ngoại lệ

Chúng tôi có thể cải thiện mã trước đó của mình bằng cách bẫy ngoại lệ mà chúng tôi bắt gặp trong mệnh đề

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 và tìm hiểu thêm về nó. Chúng tôi làm điều này bằng cách sử dụng trình quản lý ngữ cảnh ngoại lệ và lưu trữ đối tượng ngoại lệ trong một biến. Sau đó, chúng tôi có thể tự do làm việc với ngoại lệ như bất kỳ đối tượng nào khác. Đây là một đoạn trích

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8

Đoạn mã trên bắt mọi lỗi thuộc loại

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
1 và chuyển nó đến mệnh đề
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 trong một biến có tên
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
82. Điều này cho phép chúng tôi in
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
82 để tìm hiểu thêm về ngoại lệ.  

Tiếp theo, chúng ta hãy xem các từ khóa

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 của Python trong một ví dụ thực tế bằng cách sử dụng trình quản lý ngữ cảnh

Xử lý ngoại lệ trong Python. Một ví dụ

Nếu bạn đã từng nhìn thấy thông báo 404 khi duyệt web, bạn sẽ biết rằng lỗi có thể xảy ra khi thực hiện các yêu cầu HTTP. Trong Python, chúng ta phải xử lý các lỗi HTTP khi gửi yêu cầu tới máy chủ API. Đôi khi máy chủ không khả dụng hoặc kết nối mạng của bạn bị gián đoạn và Python đưa ra một ngoại lệ

Xử lý ngoại lệ trong yêu cầu HTTP

Trong ví dụ này, chúng tôi sẽ sử dụng các từ khóa

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
0 của Python để viết một hàm thực hiện yêu cầu API. Mã của chúng tôi sẽ cố gắng thực hiện yêu cầu từ máy chủ và nếu không thành công, chúng tôi sẽ bắt ngoại lệ và thử lại

Hãy bắt đầu bằng cách nhập các thư viện chúng tôi cần và xác định một số biến. Chúng tôi sẽ cần thư viện

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
88 để thực hiện yêu cầu HTTP tới máy chủ API của chúng tôi và thư viện
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
89 để giới thiệu độ trễ ngắn giữa các yêu cầu API. Chúng tôi sẽ lưu trữ URL của máy chủ API trong biến
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
70 của chúng tôi và xác định một biến
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
71 trống cho yêu cầu

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
7

Với điều đó, hãy tạo vòng lặp mà chúng tôi sẽ sử dụng để liên tục thực hiện các yêu cầu cho đến khi chúng tôi nhận được phản hồi. Sau vòng lặp

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
72 của chúng tôi, chúng tôi sẽ gói
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
73 trong một câu lệnh
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
8 và lưu trữ
answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
71

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
3

Nếu yêu cầu không đến được máy chủ vì bất kỳ lý do gì, chúng tôi sẽ cần xử lý ngoại lệ. Chúng tôi sẽ sử dụng câu lệnh ngoại trừ và tạo trình quản lý bối cảnh ngoại lệ. Nếu yêu cầu của chúng tôi gây ra lỗi, chúng tôi sẽ bắt lỗi tại đây, in ngoại lệ và đợi năm giây trước khi thử lại

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
4

Khi yêu cầu của chúng tôi thành công, chúng tôi sẽ in phản hồi

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
5

Đây là mã xử lý ngoại lệ đầy đủ

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
6

Bây giờ, hãy chứng minh một số ngoại lệ và cho biết cách mã thử lại yêu cầu cho đến khi thành công. Để tạo điều kiện thuận lợi cho việc này, chúng tôi đã tắt kết nối internet của mình và chạy mã.  

Như mong đợi, chúng tôi thấy một số ngoại lệ được in trên màn hình. Sau khi kết nối lại với internet, chúng tôi thấy phản hồi được tạo bởi một yêu cầu thành công

Ảnh chụp màn hình ở trên có thể không rõ ràng trên màn hình của bạn, vì vậy, hãy phóng to và xem xét một ngoại lệ chi tiết hơn

Thư viện

answer = None
 
try:
  answer = 50 / 0
except ZeroDivisionError:
  print["[!] Exception caught"]
 
print[answer]
88 của Python đã gây ra lỗi HTTPSConnectionPool. Nó được gây ra bởi NewConnectionError trong thư viện urllib cơ bản và lý do gây ra lỗi là lỗi tạm thời trong việc phân giải tên. Đó chính xác là những gì chúng tôi mong đợi nếu máy tính của chúng tôi bị ngắt kết nối internet.  

Học cách viết mã với Udacity

Bây giờ bạn đã học những kiến ​​thức cơ bản về xử lý ngoại lệ trong Python, hãy xem xét quay lại các dự án cũ của bạn và thêm nó. Bạn sẽ thấy rằng việc xử lý lỗi mạnh mẽ sẽ giúp phần mềm của bạn ổn định và đáng tin cậy hơn cho người dùng của bạn.  

Để tìm hiểu các khái niệm cốt lõi về lập trình thông qua HTML, CSS và Python, hãy xem phần Giới thiệu về cấp độ nano lập trình của Udacity. Đó là bước đầu tiên của bạn hướng tới sự nghiệp là một lập trình viên máy tính

Có nên sử dụng try không

Lý do sử dụng try/ngoại trừ là khi bạn có một khối mã để thực thi, khối mã này đôi khi sẽ chạy chính xác và đôi khi không , tùy thuộc vào .

Có thử bắt mã làm chậm Python không?

Giống như, các chương trình sử dụng khối ngoại trừ thử để xử lý ngoại lệ sẽ chạy chậm hơn một chút và kích thước mã của bạn sẽ tăng lên. Dưới đây là ví dụ sử dụng module timeit của Python để kiểm tra thời gian thực hiện của 2 câu lệnh khác nhau.

Có thử bắt trong Python không?

Khối try and except trong Python được sử dụng để bắt và xử lý các ngoại lệ . Python thực thi mã sau câu lệnh try như một phần “bình thường” của chương trình.

Tôi có thể sử dụng cái gì thay vì dùng thử trong Python?

Là một lập trình viên, chúng ta thường sử dụng các mẫu thử/mong đợi/cuối cùng để xử lý các hoạt động quản lý tài nguyên, chẳng hạn như mở tệp, kết nối cơ sở dữ liệu và lấy khóa. Trong Python, chúng ta có thể sử dụng câu lệnh 'with' và trình quản lý ngữ cảnh để đơn giản hóa các thao tác này.

Chủ Đề