Tin học 10 · SGK

Bài 29. Nhận biết lỗi chương trình

BÀI 29 NHẬN BIẾT LỖI CHƯƠNG TRÌNH

SAU BÀI NÀY EM SẼ:

Một chương trình hoàn chỉnh được mô tả như Hình 29.1: Tiếp nhận các dữ liệu đầu vào, xử lí theo yêu cầu bài toán và đưa ra kết quả đúng theo yêu cầu. Theo em nếu chương trình có lỗi, thì các lỗi này sẽ như thế nào và có thể ở đâu?

Hình 29.1
Hình 29.1

1. NHẬN BIẾT LỖI CHƯƠNG TRÌNH

Hoạt động 1

Quan sát các trường hợp chương trình gặp lỗi như sau, từ đó nhận biết và phân biệt một số loại lỗi của chương trình.

Trường hợp 1. Người lập trình viết sai cú pháp lệnh, chương trình lập tức dừng lại và thông báo lỗi cú pháp.

>>> while True print ("Hello")
SyntaxError: invalid syntax

Trường hợp 2. Người dùng nhập dữ liệu sai, chương trình thông báo lỗi nhập dữ liệu không đúng khuôn dạng.

>>> n = int(input("Nhập số nguyên n: "))
Nhập số nguyên n: 1.5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
n = int(input("Nhập số nguyên n: "))
ValueError: invalid literal for int() with base 10: '1.5'

Trường hợp 3. Chương trình thông báo lỗi chỉ số vượt quá giới hạn cho phép.

Array_b1.py

A = [1,3,10,0]
for i in range(5):
print (A[i], end = " ")

Khi chạy chương trình sẽ báo lỗi:

1 3 10 0 Traceback (most recent call last):
File "C:\Python\Array_b1.py", line 3, in <module>
print(A[i], end = " ")
IndexError: list index out of range

Trường hợp 4. Chương trình thực hiện bình thường nhưng kết quả không đúng với yêu cầu của bài toán. Đây là lỗi lôgic bên trong chương trình.

#Tính tổng của ba số nguyên dương đầu tiên
>>> S = 0
>>> for i in range(3)
S = s + i
>>> print(s)
3

Chương trình cho kết quả là 3 mà kết quả đúng là 1 + 2 + 3 = 6. Lí do là hàm range(3) trả lại vùng giá trị là 0, 1, 2 chứ không phải là 1, 2, 3.

Giải thích:

2. MỘT SỐ LỖI NGOẠI LỆ THƯỜNG GẶP

Một trong những vấn đề được đưa ra khi kiểm soát lỗi là làm thế nào để vẫn phát hiện lỗi, xử lí lỗi nhưng chương trình không bị dừng lại trong khi thực hiện.

Hoạt động 2. Ngoại lệ thường gặp

Đọc, thảo luận để nhận biết một số lỗi ngoại lệ thường gặp trong chương trình Python.

Mã lỗi ngoại IệMô tả Iỗi
ZeroDivisionErrorLỗi này xảy ra khi Iệnh thực hiện phép chia cho giá trị 0.
IndexErrorLỗi xảy ra khi lệnh cố gắng truy cập phần tử của danh sách nhưng chỉ số vượt quá giới hạn_
NameErrorLỗi xảy ra khi chương trình muốn tìm một tên nhưng không
TypeErrorLệnh truy cập một phần tử của danh sách nhưng chỉ số không là số nguyên. Lệnh tính biểu thức số nhưng lại có một toán hạng phải là số. không
ValueErrorLỗi liên quan đến giá trị của đối tượng. Lỗi khi thực hiện Iệnh chuyển đổi kiểu dữ liệu; đối số của hàm có giá trị mà hàm không hỗ trợ. Ví dụ khi thực hiện lệnh int (
IndentationErrorLỗi khi các dòng Iệnh thụt vào không thẳng hàng hoặc không đúng vị trí.
SyntaxErrorLỗi cú pháp_

Hãy nêu mã lỗi ngoại lệ của mỗi lệnh sau nếu xảy ra lỗi.

THỰC HÀNH

Lập trình và kiểm tra khả năng sinh lỗi khi chạy chương trình.

Nhiệm vụ 1. Viết chương trình nhập các số nguyên m, n từ bàn phím, cách nhau bởi dấu cách. Chương trình đưa ra tổng, hiệu, thương của hai số đã nhập.

Hướng dẫn. Chương trình chính là khối các lệnh nhập từ bàn phím hai số nguyên m, n. Các số này được nhập bằng lệnh input(), kết quả là một xâu kí tự. Xâu này sẽ được tách thành danh sách các xâu con bằng lệnh split(). Kết quả thu được sẽ chuyển đổi thành hai số m, n bằng lệnh int(). Nhập chương trình sau và kiểm tra khả năng sinh lỗi khi chạy chương trình.

s = input("Nhập hai số m, n cách nhau bởi dấu cách: ")
sline = s.split()
m, n = int(sline[0]), int(sline[1])
print("Tổng, hiệu, thương 2 số đã nhập là:",m+n, m-n,m/n)

Gợi ý. Các khả năng sinh lỗi của chương trình:

Nhiệm vụ 2. Viết chương trình nhập số tự nhiên n và nhập lần lượt n số nguyên đưa vào danh sách số A. Sau khi nhập xong in danh sách A ra màn hình.

Hướng dẫn. Nhập chương trình sau và kiểm tra khả năng sinh lỗi khi chạy.

n = int(input("Nhập số tự nhiên n: "))
A = []
for k in range(n):
num = int(input("Nhập số thứ "+str(k+1)+" : "))
A.append(num)
print("Dãy đã nhập:",A)

Gợi ý. Các khả năng sinh lỗi của chương trình:

LUYỆN TẬP

A = [1,3,5,10,0]
s1, s2 = "101010", 1010101
for k in range(1,len(A)+1):
print(A[k])
gttb = sum(A) / len(A)

Lệnh này có thể sinh lỗi ngoại lệ không? Nếu có thì là những lỗi gì?

VẬN DỤNG