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ệnhanswer = 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