Python xử lý oserror như thế nào?
Python in truy nguyên khi có ngoại lệ trong mã của bạn. Đầu ra theo dõi có thể hơi choáng ngợp nếu bạn nhìn thấy nó lần đầu tiên hoặc bạn không biết nó đang nói gì với bạn. Tuy nhiên, truy nguyên Python có rất nhiều thông tin có thể giúp bạn chẩn đoán và khắc phục lý do ngoại lệ được đưa ra trong mã của bạn. Hiểu những thông tin mà truy nguyên Python cung cấp là rất quan trọng để trở thành một lập trình viên Python giỏi hơn Show
Đến cuối hướng dẫn này, bạn sẽ có thể
Tiền thưởng miễn phí. Nhấp vào đây để nhận Bảng cheat Python miễn phí của chúng tôi, trang này cho bạn biết kiến thức cơ bản về Python 3, như làm việc với các kiểu dữ liệu, từ điển, danh sách và hàm Python Truy nguyên Python là gì?Truy nguyên là một báo cáo chứa các lệnh gọi hàm được thực hiện trong mã của bạn tại một điểm cụ thể. Truy nguyên được biết đến với nhiều tên, bao gồm theo dõi ngăn xếp, truy nguyên ngăn xếp, truy nguyên ngược và có thể các tên khác. Trong Python, thuật ngữ được sử dụng là truy nguyên Khi chương trình của bạn dẫn đến một ngoại lệ, Python sẽ in truy nguyên hiện tại để giúp bạn biết điều gì đã xảy ra. Dưới đây là một ví dụ để minh họa tình huống này
Ở đây, 8 được gọi với tham số 9. Tuy nhiên, trong 8, tên biến đó không được sử dụng. Thay vào đó, nó đã bị viết sai chính tả thành 1 trong lệnh gọi 2Ghi chú. Hướng dẫn này giả định rằng bạn hiểu các ngoại lệ của Python. Nếu bạn chưa quen hoặc chỉ muốn ôn lại, thì bạn nên xem Python Exceptions. Một lời giới thiệu Khi bạn chạy chương trình này, bạn sẽ nhận được dấu vết sau
Đầu ra truy nguyên này có tất cả thông tin bạn cần để chẩn đoán sự cố. Dòng cuối cùng của đầu ra truy nguyên cho bạn biết loại ngoại lệ nào đã được nêu ra cùng với một số thông tin liên quan về ngoại lệ đó. Các dòng trước đó của truy nguyên chỉ ra mã dẫn đến ngoại lệ được nêu ra Trong truy ngược ở trên, ngoại lệ là một 3, có nghĩa là có một tham chiếu đến một số tên (biến, hàm, lớp) chưa được xác định. Trong trường hợp này, tên được tham chiếu là 1Dòng cuối cùng trong trường hợp này có đủ thông tin để giúp bạn khắc phục sự cố. Tìm kiếm mã cho tên 1, một lỗi chính tả, sẽ chỉ cho bạn đúng hướng. Tuy nhiên, thường thì mã của bạn phức tạp hơn rất nhiềuLoại bỏ các quảng cáoLàm thế nào để bạn đọc một Traceback Python?Truy nguyên Python chứa rất nhiều thông tin hữu ích khi bạn đang cố gắng xác định lý do cho một ngoại lệ được đưa ra trong mã của bạn. Trong phần này, bạn sẽ xem qua các lần truy nguyên khác nhau để hiểu các phần thông tin khác nhau có trong một lần truy nguyên Tổng quan về truy nguyên PythonCó một số phần quan trọng đối với mọi truy nguyên Python. Sơ đồ dưới đây làm nổi bật các phần khác nhau Trong Python, tốt nhất là đọc truy nguyên từ dưới lên
Có một số khác biệt giữa đầu ra truy nguyên khi bạn đang thực thi mã của mình trong dòng lệnh và chạy mã trong REPL. Dưới đây là mã tương tự từ phần trước được thực thi trong REPL và kết quả là đầu ra truy nguyên >>>
Lưu ý rằng thay cho tên tệp, bạn nhận được 6. Điều này hợp lý vì bạn đã nhập mã thông qua đầu vào tiêu chuẩn. Ngoài ra, các dòng mã đã thực hiện không được hiển thị trong truy nguyênGhi chú. Nếu bạn đã quen nhìn thấy dấu vết ngăn xếp trong các ngôn ngữ lập trình khác, thì bạn sẽ nhận thấy sự khác biệt lớn trong cách so sánh với dấu vết của Python. Hầu hết các ngôn ngữ khác in ngoại lệ ở trên cùng và sau đó đi từ trên xuống dưới, cuộc gọi gần đây nhất đến cuộc gọi gần đây nhất Nó đã được nói rồi, nhưng chỉ để nhắc lại, truy nguyên Python nên được đọc từ dưới lên trên. Điều này rất hữu ích vì truy nguyên được in ra và thiết bị đầu cuối của bạn (hoặc bất cứ nơi nào bạn đang đọc truy nguyên) thường kết thúc ở cuối đầu ra, giúp bạn có một vị trí hoàn hảo để bắt đầu đọc truy nguyên Hướng dẫn truy nguyên cụ thểXem qua một số đầu ra truy ngược cụ thể sẽ giúp bạn hiểu rõ hơn và xem truy nguyên sẽ cung cấp cho bạn thông tin gì Đoạn mã dưới đây được sử dụng trong các ví dụ sau để minh họa thông tin mà truy nguyên Python cung cấp cho bạn
Ở đây, 7 lấy một giá trị, 8, và trả về giá trị đó hoặc nhắc trả về một giá trị thay thếSau đó, 8 lấy một cái tên để được chào đón, 9, và một giá trị 71 tùy chọn và gọi 2. 7 cũng được gọi với giá trị 9 được truyền vàoCuối cùng, 75 sẽ lặp qua danh sách của 76 và gọi 8. Nếu có một ngoại lệ được đưa ra bằng cách gọi 8, thì một lời chào dự phòng đơn giản sẽ được inMã này không có bất kỳ lỗi nào dẫn đến ngoại lệ được đưa ra miễn là đầu vào phù hợp được cung cấp Nếu bạn thêm lệnh gọi tới 8 vào cuối 60 và chỉ định một đối số từ khóa mà nó không mong đợi (ví dụ: 61), thì bạn sẽ nhận được truy nguyên sau 7Một lần nữa, với truy nguyên Python, tốt nhất là làm việc ngược lại, di chuyển đầu ra lên. Bắt đầu từ dòng cuối cùng của truy nguyên, bạn có thể thấy rằng ngoại lệ là một 62. Các thông báo theo loại ngoại lệ, mọi thứ sau dấu hai chấm, cung cấp cho bạn một số thông tin tuyệt vời. Nó cho bạn biết rằng 8 đã được gọi với một đối số từ khóa mà nó không mong đợi. Tên đối số chưa biết cũng được cung cấp cho bạn. 64Di chuyển lên trên, bạn có thể thấy dòng dẫn đến ngoại lệ. Trong trường hợp này, đó là cuộc gọi 8 mà chúng tôi đã thêm vào cuối của 60Dòng tiếp theo cung cấp cho bạn đường dẫn đến tệp chứa mã, số dòng của tệp đó nơi có thể tìm thấy mã và mã đó nằm trong mô-đun nào. Trong trường hợp này, vì mã của chúng tôi không sử dụng bất kỳ mô-đun Python nào khác, chúng tôi chỉ thấy 67 ở đây, nghĩa là đây là tệp đang được thực thiVới một tệp khác và đầu vào khác, bạn có thể thấy quá trình truy nguyên thực sự chỉ cho bạn đúng hướng để tìm ra sự cố. Nếu bạn đang theo dõi, hãy xóa lệnh gọi 8 có lỗi ở cuối 60 và thêm tệp sau vào thư mục của bạn 6Tại đây, bạn đã thiết lập một tệp Python khác đang nhập mô-đun trước đó của bạn, 60 và sử dụng 8 từ mô-đun đó. Đây là những gì sẽ xảy ra nếu bây giờ bạn chạy 02 0Trường hợp ngoại lệ được đưa ra trong trường hợp này lại là một 62, nhưng lần này thông báo ít hữu ích hơn một chút. Nó cho bạn biết rằng ở đâu đó trong mã, nó dự kiến sẽ hoạt động với một chuỗi, nhưng một số nguyên đã được đưa raDi chuyển lên trên, bạn thấy dòng mã đã được thực thi. Sau đó, tệp và số dòng của mã. Tuy nhiên, lần này, thay vì 67, chúng ta lấy tên của hàm đang được thực thi, 8Di chuyển đến dòng mã được thực thi tiếp theo, chúng tôi thấy lệnh gọi 8 có vấn đề của chúng tôi chuyển qua một số nguyênĐôi khi sau khi một ngoại lệ được đưa ra, một đoạn mã khác sẽ bắt ngoại lệ đó và cũng dẫn đến một ngoại lệ. Trong những tình huống này, Python sẽ xuất ra tất cả các lần theo dõi ngoại lệ theo thứ tự mà chúng được nhận, một lần nữa kết thúc bằng lần theo dõi của ngoại lệ tăng gần đây nhất Vì điều này có thể hơi khó hiểu, đây là một ví dụ. Thêm cuộc gọi tới 75 vào cuối 60 8Điều này sẽ dẫn đến việc in lời chào cho cả ba người. Tuy nhiên, nếu bạn chạy mã này, bạn sẽ thấy một ví dụ về nhiều truy xuất ngược được xuất ra 9Lưu ý dòng được đánh dấu bắt đầu bằng 09 ở đầu ra ở trên. Ở giữa tất cả các dấu vết, bạn sẽ thấy dòng này. Thông báo của nó rất rõ ràng, trong khi mã của bạn đang cố xử lý ngoại lệ trước đó, thì một ngoại lệ khác đã được đưa raGhi chú. Tính năng hiển thị truy nguyên ngoại lệ trước đó của Python đã được thêm vào Python 3. Trong Python 2, bạn sẽ chỉ nhận được truy nguyên của ngoại lệ cuối cùng Bạn đã từng thấy ngoại lệ trước đó, khi bạn gọi 8 bằng một số nguyên. Vì chúng tôi đã thêm một 81 vào danh sách những người cần chào hỏi, nên chúng tôi có thể mong đợi kết quả tương tự. Tuy nhiên, hàm 75 kết thúc lệnh gọi 8 trong khối 84 và 85. Chỉ trong trường hợp 8 dẫn đến một ngoại lệ được đưa ra, 75 muốn in một lời chào mặc địnhPhần có liên quan của 60 được lặp lại ở đây 0Vì vậy, khi 8 cho kết quả là 62 do đầu vào số nguyên không hợp lệ, 75 sẽ xử lý ngoại lệ đó và cố gắng in một lời chào đơn giản. Ở đây mã kết thúc dẫn đến một ngoại lệ khác, tương tự. Nó vẫn đang cố thêm một chuỗi và một số nguyênXem tất cả đầu ra truy nguyên có thể giúp bạn biết đâu có thể là nguyên nhân thực sự của một ngoại lệ. Đôi khi, khi bạn thấy ngoại lệ cuối cùng được đưa ra và kết quả truy nguyên của ngoại lệ đó, bạn vẫn không thể thấy điều gì sai. Trong những trường hợp đó, chuyển sang các trường hợp ngoại lệ trước đó thường giúp bạn hiểu rõ hơn về nguyên nhân gốc rễ Loại bỏ các quảng cáoMột số Tracback phổ biến trong Python là gì?Biết cách đọc truy nguyên Python khi chương trình của bạn phát sinh ngoại lệ có thể rất hữu ích khi bạn lập trình, nhưng biết một số truy nguyên phổ biến hơn cũng có thể tăng tốc quá trình của bạn Dưới đây là một số trường hợp ngoại lệ phổ biến mà bạn có thể gặp phải, lý do chúng tăng lên và ý nghĩa của chúng cũng như thông tin bạn có thể tìm thấy trong truy nguyên của chúng # greetings.py def who_to_greet(person): return person if person else input('Greet who? ') def greet(someone, greeting='Hello'): print(greeting + ', ' + who_to_greet(someone)) def greet_many(people): for person in people: try: greet(person) except Exception: print('hi, ' + person) 92 92 được nâng lên khi bạn cố gắng truy cập một thuộc tính trên một đối tượng không xác định thuộc tính đó. Tài liệu Python xác định khi nào ngoại lệ này được đưa ra
Đây là một ví dụ về 92 được nêu ra>>> 0Dòng thông báo lỗi cho một 92 cho bạn biết rằng loại đối tượng cụ thể, trong trường hợp này là 96, không có thuộc tính được truy cập, trong trường hợp này là 97. Nhìn thấy 92 trong dòng thông báo lỗi có thể giúp bạn nhanh chóng xác định thuộc tính nào mà bạn đã cố truy cập và nơi để khắc phục sự cố đóHầu hết thời gian, việc nhận được ngoại lệ này cho thấy rằng bạn có thể đang làm việc với một đối tượng không phải là loại mà bạn mong đợi >>> 1Trong ví dụ trên, bạn có thể mong đợi 99 thuộc loại 00, có một phương thức gọi là 01. Khi bạn nhận được ngoại lệ 92 và thấy rằng nó đã được nâng lên khi bạn đang cố gọi 01, điều đó cho bạn biết rằng bạn có thể không xử lý loại đối tượng mà bạn mong đợiThông thường, điều này xảy ra khi bạn đang mong đợi một đối tượng được trả về từ một lệnh gọi hàm hoặc phương thức thuộc một loại cụ thể và bạn kết thúc với một đối tượng thuộc loại 04. Trong trường hợp này, dòng thông báo lỗi sẽ đọc, 05$ python example.py
Traceback (most recent call last):
File "/path/to/example.py", line 4, in |