Chuyên mục
Học kỳ Mùa xuân 2023 Khám phá Khoá học Python Blog

Các phương pháp debug trong Python

Về cơ bản, debug là việc tìm kiếm và sửa lỗi trên máy tính. Khi chương trình không hoạt động như mong đợi, việc debug sẽ giúp chúng ta tìm ra nguyên nhân và sửa chữa các lỗi đó.

Author: Quang Nguyễn

Ở bài học Vui học thầy cô của lớp CS 101, chúng ta đã ôn tập lại kiến thức về số nhị phân, kiến thức về vòng lặp, câu điều kiện, và các kiểu dữ liệu trong Python. 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”.

1. Cách đọc thông báo lỗi

Traceback message trong Thonny khi chương trình gặp lỗi

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.

2. Các loại lỗi

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:

1. SyntaxError: Lỗi cú phá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ụ: 

Ở 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:

2. IndentationError: Lỗi thụt đầu dòng không đúng cách

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.

  • Ví dụ:

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.

3. IndexError: Lỗi chỉ mục

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.

  • Ví dụ:

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:

3. TypeError: Lỗi kiểu dữ liệu

Khi bạn sử dụng sai kiểu dữ liệu hoặc không tương thích

  • Ví dụ: 

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:

5. NameError: Lỗi tên

Khi một biến hay tên hàm chưa được định nghĩa.

  • Ví dụ: Tương tự ví dụ biến “chieu_rong” chưa được định nghĩa ở phần 1.

3. Các lỗi thường gặp

1. Chính tả:

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.

  • Ví dụ:

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.

2. Thiếu dấu ngoặc đơn

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.

  • Ví dụ:

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”.

3. Thiếu dấu ngoặc kép

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.

  • Ví dụ:

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.

4. = vs ==

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.

  • Ví dụ:

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”.

5. Vòng lặp vô hạn

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.

  • Ví dụ:

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:

6. Lỗi Off-by-one

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ử đó. 

  • Ví dụ: Tương tự ví dụ về IndexError ở phần 2.

4. Các phương pháp debug trong Python

1. Câu lệnh print:

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:

2. Sử dụng Python Tutor để trực quan hoá mã nguồn

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:

  • Bước 1: Đầu tiên các bạn truy cập vào trang web https://pythontutor.com/. Sau đó ở dòng bắt đầu với “Start coding now” các bạn bấm vào Python như hình dưới đây:
  • Bước 2: Tiếp theo, các bạn nhập chương trình Python vào ô văn bản bên trái của trang web hoặc sao chép và dán nó từ một nguồn bên ngoài. 
  • Bước 3: Sau khi nhập trong mọi người nhấn vào nút “Visualize execution” để bắt đầu quá trình thực thi. 
  • Bước 4: Theo dõi quá trình thực thi trên biểu đồ bên phải của trang web. Nó sẽ hiển thị các biến và giá trị của chúng trên từng dòng lệnh trong chương trình. Để xem cách thực thi từng dòng lệnh, các bạn có thể nhấn vào các nút “Next” hoặc “Prev” để di chuyển tới dòng lệnh tiếp theo hoặc dòng lệnh trước đó. Bạn cũng có thể thay đổi tốc độ thực thi bằng cách sử dụng thanh kéo bên trái của trang web. 

3. Sử dụng công cụ debug trong Thonny

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ụ: 

Ở 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:

  • Step Over: Thực thi lệnh hiện tại và di chuyển đến lệnh tiếp theo trong mã nguồn.
  • Step Into: Lệnh này cho phép bạn “nhảy” vào trong một hàm, phương thức hoặc các lệnh con khác được gọi trong chương trình của mình.
  • Step Out: Thoát ra khỏi hàm hoặc phương thức đang được thực thi và trở lại dòng gọi hàm hoặc  phương thức đó.
  • Resume: Tiếp tục thực thi chương trình cho đến khi kết thúc.
  • Stop: Dừng chương trình.

Chúc các bạn thành công!

— — —

STEAM for Vietnam Foundation là tổ chức phi lợi nhuận 501(c)(3) được thành lập tại Hoa Kỳ với sứ mệnh thúc đẩy các hoạt động liên quan tới giáo dục STEAM (Science — Khoa học, Technology — Công nghệ, Engineering — Kỹ thuật, Arts — Nghệ thuật, Mathematics — Toán học) tại Việt nam. STEAM for Vietnam được thành lập và vận hành bởi đội ngũ tình nguyện viên là du học sinh và chuyên gia người Việt trên khắp thế giới.

— — —

📧Email: hello@steamforvietnam.org

🌐Website: www.steamforvietnam.org

🌐Fanpage: STEAM for Vietnam

📺YouTube:  http://bit.ly/S4V_YT

🌐Zalo: Zalo Official

📍Donation: https://www.steamforvietnam.org/donation

Leave a Reply

Your email address will not be published. Required fields are marked *