Hôm nay chúng ta sẽ tìm hiểu về một khái niệm quan trọng khi làm việc với máy tính, đó là “debug”.
Traceback message là thông báo lỗi được hiển thị trong Python khi có lỗi xảy ra trong quá trình thực thi chương trình. Thông báo bao gồm một loạt các dòng văn bản, thường bắt đầu với “Traceback (most recent call last):” và kết thúc với một dòng mô tả lỗi cụ thể. Các dòng ở thông báo traceback thường đi theo cặp với nhau. Dòng đầu tiên ở mỗi cặp có cấu trúc như sau:
File “<file name>”, line <number>, in <function>
File name: Tên file chứa lỗi
Number: Số thứ tự dòng trong file gây ra lỗi, hoặc số thứ tự dòng trong file chứa lần gọi hàm tiếp theo.
Function: tên của function trong dòng <number>
Dòng thứ hai hiển thị chính xác đoạn code ở dòng <number> gây ra lỗi. Dòng cuối cùng trong traceback message sẽ cho biết loại lỗi và thông tin chi tiết về lỗi và có cấu trúc như sau:
<error type>: <error message>
Error type: Loại lỗi đã được gây ra
Error message: Mô tả chi tiết hơn về nguyên nhân gây ra lỗi
Ở ví dụ trên, chương trình thực hiện tính diện tích hình chữ nhật (dien_tich) bằng cách tính tích của chiều dài và chiều rộng (chieu_dai * chieu_rong):
và đây là thông báo lỗi sau khi chạy chương trình
Trong ví dụ này, lỗi xảy ra khi chương trình cố gắng thực hiện phép tính toán trên biến ‘chieu_rong’ mà không được định nghĩa trước đó (khác với biến ‘chieu_dai‘ đã được định nghĩa trước đó qua dòng đầu tiên: chieu_dai = 10). Dòng cuối cùng cho biết rằng kiểu lỗi là NameError và biến ‘chieu_rong’ không được định nghĩa. Dòng trước cho biết lỗi xảy ra trong tệp “traceback-message.py” tại dòng số 2 trong hàm module.
Dưới đây là một số kiểu lỗi phổ biến trong Python mà mọi người thường gặp:
Thường xảy ra khi bạn viết sai cú pháp trong Python, ví dụ như quên đóng dấu ngoặc hoặc sử dụng từ khoá không đúng cách.
Ở ví dụ trên chúng ta có một danh sách điểm số và muốn in các điểm số ra màn hình, tuy nhiên chạy chương trình gặp thông báo lỗi như sau:
Trong ví dụ này, lỗi xảy ra khi chúng ta viết sai cú pháp khi quên mất dấu phẩy ngăn cách giữa hai điểm số cuối cùng (10 và 9) khi tạo danh sách tại dòng 1. Sau khi thêm dấu phẩy còn thiếu, chương trình sẽ chạy bình thường như hình minh hoạ dưới đây:
Trong Python, thụt đầu dòng rất quan trọng và được sử dụng để xác định khối lệnh trong một hàm hoặc vòng lặp.
Khi chạy chương trình này. chúng ta sẽ nhận lỗi như sau:
Trong ví dụ này, chúng ta quên thụt đầu dòng ở dòng số 3 sau câu lệnh for nên gặp lỗi IndentationError.
Khi bạn cố gắng truy cập một phần tử trong danh sách hoặc chuỗi vượt quá phạm vi chỉ mục.
Khi chạy chương trình này. chúng ta sẽ nhận lỗi như sau:
Trong chương trình này, chúng ta muốn truy cập phần tử cuối cùng của danh sách có 5 phần tử, tuy nhiên chỉ mục của danh sách bắt đầu tử chỉ mục 0, nên chỉ mục của phần tử cuối cùng của danh sách có 5 phần tử là 4. Sau khi sửa lại chúng ta sẽ có chương trình chạy bình thường như sau:
Khi bạn sử dụng sai kiểu dữ liệu hoặc không tương thích
Trong ví dụ này, chúng ta có hai biến a và b và muốn tính tổng của a và b và in ra màn hình. Tuy nhiên khi chạy chương trình, chúng ta gặp lỗi như sau:
Thông báo lỗi cho chúng ta biết rằng hai kiểu biến ‘int’ và ‘str’ không tương thích cho phép tính cộng ‘+’. Vì vậy, để sửa lỗi này, chúng ta cần chuyển kiểu dữ liệu của biến b sang ‘int’ hoặc ‘float’ để tương thích với biến a:
Khi một biến hay tên hàm chưa được định nghĩa.
Chú ý rằng Python phân biệt chữ hoa với chữ thường. Biến hello khác với biến Hello, HELLO, hay hEllO. Lỗi này thường sẽ được hiển thị dưới dạng NameError.
Trong ví dụ này, chú ý rằng myCourse và MyCourse là hai biến khác nhau và biến MyCourse chưa được định nghĩa trước đó nên khi chạy chương trình sẽ gặp lỗi NameError.
Một lỗi phổ biến là bỏ qua dấu ngoặc đơn đóng. Việc nãy sẽ dẫn đến lỗi cú pháp SyntaxError.
Trong ví dụ này, ở dòng thứ hai câu lệnh print chúng ta thiếu dấu ngoặc đơn đóng nên khi chạy sẽ gặp lỗi “SyntaxError”.
Lỗi nãy giống với lỗi trước đó. Python sẽ thông báo với bạn chính xác số thứ tự dòng đã gây ra lỗi.
Trong ví dụ này, ở dòng đầu tiên chúng ta quên đóng dấu ngoặc kép khi gán một chuỗi cho biến myCourse nên khi chạy chương trình sẽ gặp thông báo lỗi như trên.
Chú ý rằng dấu “=” dùng cho việc gán giá trị vào biến, dấu “==” được sử dụng kiểm tra tính tương đương.
Trong ví dụ này, chú ý rằng ở dòng thứ hai n = 10 là ta đang gán giá trị 10 vào biến n chứ không phải kiểm tra tình tương đương. Để sửa lại, chúng ta cần viết “n = 10” thành “n == 10”.
Vòng lặp vô hạn thường được gây ra bởi vòng lặp while khi điều kiện không bao giờ thay đổi hoặc điều kiện cuối không bao giờ xảy ra.
Trong ví dụ này, trong vòng lặp while vì quên cập nhật biến n sau mỗi vòng lặp nên điều kiện n < 10 không bao giờ xảy ra, vì vậy chương trình chạy vô hạn. Để sửa lại chúng ta cập nhật biến n như sau:
Lỗi này thường xảy ra khi ta muốn xử lý một tập hợp dữ liệu có độ dài cố định và nhầm lẫn trong việc tính toán số lượng của phần tử đó.
Một trong những cách đơn giản nhất để debug trong Python là sử dụng hàm print() để hiển thị giá trị của biến trong chương trình. Ví dụ, nếu bạn đang phát triển một chương trình tính toán tổng của 10 số tự nhiên đầu tiên, bạn có thể in ra màn hình để kiểm tra giá trị của biến total sau mỗi vòng lặp như sau:
PythonTutor là một công cụ rất hữu ích giúp người dùng hiểu và theo dõi quá trình thực thi các chương trình Python. Say đây là các bước cơ bản để sử dụng Python Tutor:
Trong Thonny có một trình sửa lỗi, cho phép người dùng người dùng đi qua từng bước trong chương trình. Ở phía trên cửa sổ Thonny, bên cạnh nút chạy chương trình, các bạn sẽ thấy một dãy các nút như sau:
Để kích hoạt trình sửa lỗi, các bạn bấm vào nút có biểu tượng con bọ. Sau khi bấm xong, các nút sẽ thay đổi như sau:
Những nút này sẽ giúp chúng ta kiểm soát luồng chương trình theo từng bước, và Thonny sẽ hiển thị chính xác những gì đang diễn ra bằng cách đánh dấu phần mã đang được thực thi. Ngoài ra thì các bạn cũng có thể đặt các điểm dừng (breakpoints) trong chương trình. Điểm dừng là một vị trí trong mã nguồn mà chương trình sẽ dừng lại và chờ cho người dùng kiểm tra các giá trị và trạng thái của chương trình tại thời điểm đó. Để đặt điểm dừng, các bạn bấm vào số thứ tự ở bên lề tại dòng mà các bạn muốn chương trình dừng lại. Sau khi bấm xong, dòng có điểm dừng sẽ được đánh dấu bằng một hình tròn màu đỏ như hình dưới đây.
Để xoá điểm dừng, các bạn đơn giản chỉ cần bấm lại vào hình tròn màu đỏ các bạn muốn xoá.
Ở ví dụ này, giả sự chúng ta muốn theo dõi giá trị của từng biến qua từng vòng lặp for trong quá trình chạy chương trình.
Đầu tiên chúng ta sẽ đặt điểm dừng (breakpoint) ở dòng mà chúng ta muốn chương trình dừng lại (ở đây là dòng số 4).
Sau đó, ở trên thanh menu, chúng ta chọn View >> Variables, khi đó Thonny sẽ hiện ra một cửa sổ để các bạn theo dõi các biến trong quá trình chương trình chạy.
Các bạn bấm vào biểu tượng con bọ để bắt đầu debug, chương trình sẽ dừng lại ở dòng thứ 4 như hình bên dưới. Ở khung cửa số Variables, các bạn có thể thấy giá trị của các biến trong vòng lặp đầu tiên đã được cập nhật.
Sau đó, chúng ta sẽ sử dụng các nút Step over, Step into, Step out, Resume và Stop để kiểm soát luồng chương trình:
Chúc các bạn thành công!
Tác giả bài viết: Thanh Sơn
Nguồn tin: www.steamforvietnam.org
Ý kiến bạn đọc
Những tin mới hơn
Những tin cũ hơn