You are on page 1of 8

Bài tập Tuần 2

Ngoại lệ (Exception) và Khẳng định (Assertion)

Giảng viên Giới thiệu sơ lược về Exception và Assertion


Thị phạm về sử dụng cấu trúc try ... except để bắt và xử lý ngoại lệ
Thị phạm về sử dụng câu lệnh assert để kiểm tra điều kiện
Giao bài tập cho sinh viên
Kiểm tra bài tập của sinh viên
Làm câu hỏi trắc nghiệm ở nhà.
Sinh viên Thực hành các bài tập

Danh sách bài tập


Thực hiện các bài tập thực hành có sử dụng cấu trúc try ... except để bắt và xử lý ngoại lệ.
Sử dụng assert để kiểm tra điều kiện.
Bài 1
Cho đoạn chương trình sau, sừ dụng cấu trúc try… except để tránh lỗi IndexError

lst=[5, 10, 20]


print(lst[5])

Đáp án tham khảo:

lst=[5, 10, 20]


msg=””
try:
print(lst[5])
except IndexError:
msg="Lỗi chỉ số nằm ngoài phạm vi danh sách"
print(msg)

Bài 2
Viết chương trình yêu cầu người dùng nhập vào một số nguyên từ 1 đến 10. Nếu số nhập
vào nằm ngoài phạm vi, hãy sử dụng hàm raise để sinh ra một lỗi ValueError và thông
báo rằng dữ liệu là không hợp lệ.
Đáp án:
number = int(input("Please enter a number between 1 and 10: "))

if number not in range(1, 11):


raise ValueError(f"The number must be between 1 and 10. You
entered {number}.")
f: định dạng chuỗi.
Bài 3
Cho hàm divide như sau. Sử dụng cấu trúc try … except để bắt các ngoại lệ
ZeroDivisionError, TypeError và ArithmeticError

def divide(a, b):


print(a / b)

Đáp án:

divide(a, b):
try:
print(a / b)
except ZeroDivisionError:
print("Cannot divide by zero")
except TypeError:
print("Both values must be numbers. Cannot divide {a} and
{b}")
except ArithmeticError:
print("Could not complete the division. The numbers were
likely too large")

Bài 4
Cho hàm như sau:

def fancy_divide(numbers,index):
denom = numbers[index]
for i in range(len(numbers)):
numbers[i] /= denom
Viết lại hàm trên, sử dụng cấu trúc try.. except để bắt các lỗi có thể xảy ra (IndexError,
ZeroDivisionError, …).
Chạy chương trình và nhập liệu để kiểm thử hàm.
Đáp án tham khảo

def fancy_divide(numbers, index):


try:
denom = numbers[index]
for i in range(len(numbers)):
numbers[i] /= denom
except IndexError:
print("Lỗi chỉ mục")
except ZeroDivisionError:
print("Lỗi chia cho 0")
else:
print("Lỗi khác")

Bài 5
Viết một chương trình cho phép người dùng nhập vào một danh sách các số nguyên
dương được phân tách bằng dấu phẩy. Phân tách chuỗi nhập vào thành các số nguyên
riêng lẻ. Sử dụng cấu trúc câu lệnh try … except để thông báo cho người dùng khi không
thể chuyển đổi các giá trị mà họ đã nhập. (Ví dụ người dùng nhập vào: 76, 93, 84, 81 thì
chuyển thành [76, 93, 84, 81]
Đáp án tham khảo:

grades = input("nhập vào một dãy số nguyên, phân cách bởi dấu phẩy:
").split(",")

try:
grades = [int(grade) for grade in grades]
except ValueError:
print("Số nhập vào không đúng định dạng.")
print(grades)

Bài 6
Cho hàm get_item() như sau:

def get_item(collection, index):


return collection[index]
Sửa lại hàm trên để bắt các ngoại lệ KeyError và IndexError và ghi thông tin ngoại lệ vào
file có tên là log.txt.
Đáp án tham khảo:

def log_exception(exception, fn, values):


with open("log.txt", "a") as log_file:
log_file.write(f"Exception: {exception}, Function: {fn},
Values: {values}")
def get_item(collection, index):
try:
return collection[index]
except IndexError as ex:
log_exception(ex, "get_item", "IndexError")
except KeyError as ex1:
log_exception(ex1, "get_item", "lKeyError")

Bài 7
Giả sử bạn có một tệp văn bản có tên data.txt (giả sử tệp này chứa dòng chữ “test
exception”). Đọc tệp và hiển thị nội dung lên màn hình, sử dụng cấu trúc try .. except bắt
ngoại lệ phát sinh nếu tệp không tồn tại.
Đáp án tham khảo

try:
with open("data.txt", "r") as text_file:
print(text_file.read())
except FileNotFoundError:
print("Error: Couldn't find data.txt")
else:
text_file.close()

Bài 8
Viết 1 máy tính giả lập. Dữ liệu được người dùng nhập vào từ bàn phím. Dữ liệu nhập
vào bao gồm một số, một toán tử (+,-,*,/) và một số khác, mỗi thành phần phân cách
nhau bởi khoảng trắng. (Ví dụ 1 + 1 hoặc 2 – 3).
Phân tách dữ liệu đầu vào của người dùng bằng cách sử dụng str.split() và kiểm tra kết
quả giá trị đầu vào.
- Nếu đầu vào không đủ 3 thành phần thì báo ra 1 lỗi
- Nếu thành phần thứ nhất và thứ ba không phải là một số thực (float) báo ra 1 lỗi.
- Nếu thành phần thứ hai không phải là toán tử (+,-,*,/) báo ra 1 lỗi.
- Nếu giá trị đầu vào đúng thì hiển thị ra kết quả
Ví dụ: >>> 1 + 1
2.0
>>> 3.2 - 1.5
1.7
Viết các hàm và chương trình thực hiện các công việc trên, sử dụng cấu trúc try.. except
để bắt các ngoại lệ và hàm raise để sinh ra một lỗi.
(Gợi ý:
- Viết 1 hàm kiểm tra dữ liệu đầu vào
- Viết 1 hàm thực hiện phép tính với các toán tử (+,-,*,/) nếu dữ liệu đầu vào là
đúng.
- Viết một chương trình cho phép nhập dữ liệu đầu vào và sử dụng các hàm trên,
chương trình nhập kết thúc nếu người dùng nhập ký tự ‘q’)
Xây dựng bộ testcase để kiểm thử chương trình.
Đáp án:

def parse_input(user_input):

input_list = user_input.split()
if len(input_list) != 3:
raise ValueError('Input does not consist of three elements')
n1, op, n2 = input_list
try:
n1 = float(n1)
n2 = float(n2)
except ValueError:
raise ValueError('The first and third input value must be
numbers')
return n1, op, n2

def calculate(n1, op, n2):

if op == '+':
return n1 + n2
if op == '-':
return n1 - n2
if op == '*':
return n1 * n2
if op == '/':
return n1 / n2
raise ValueError('{0} is not a valid operator'.format(op))

Chương trình chạy test

while True:
user_input = input('>>> ')
if user_input == 'exit':
break
try:
n1, op, n2 = parse_input(user_input)
result = calculate(n1, op, n2)
print(result)
except ValueError as ex
print(ex)

Bài 9
Viết hàm nhận một danh sách (list) các số nguyên làm đối số và trả về danh sách các số
chẵn.
Yêu cầu:
- Trong hàm sử dụng lệnh assert để kiểm tra điều kiện đầu vào là một danh sách
(list) số nguyên không được rỗng
- Sử dụng các câu lệnh assert để kiểm thử hàm.

def only_even_numbers(ls: list):


assert type(ls) == list, "The list should be a list, not a " +
str(type(ls))[8:-2]
assert len(ls)!=0, “can not empty list”
EVEN = []
for num in ls:
if num % 2 == 0:
EVEN.append(num)
return EVEN

assert only_even_numbers([1, 2, 3]) == [2]


assert only_even_numbers([-5, -4, -3, -2, -1, 1, 2, 3, 4, 5]) == [-4,
-2, 2, 4]
assert only_even_numbers([-4, -3, 1]) == [-4]
assert only_even_numbers([1, 1, 1, 1, 1, 1]) == []
print("Exercise is correct.")

Bài 10
Viết một hàm nhận danh sách (list) các số nguyên làm đối số và trả về phần tử lớn nhất
trong danh sách. (Lưu ý KHÔNG sử dụng hàm max() có sẵn)
Yêu cầu:
- Trong hàm sử dụng lệnh assert để kiểm tra điều kiện đầu vào là một danh sách số
nguyên không được rỗng.
- Sử dụng các câu lệnh assert để kiểm thử hàm.
Đáp án tham khảo

def max_num(max_list: list) -> int:


'''Takes a list of integers and returns the max number in the
list'''
assert len(max_list)!=0, “can not empty list”

maximum = max_list[0]
for i in max_list:
if type(i) != int:
return("The list should only have integers, not " +
str(type(i))[8:-2])
elif i > maximum:
maximum = i
return maximum

Chạy hàm và kiểm thử với câu lệnh assert

assert max_num([-9, -23, -7, -2, -6, -8, -34, -24, -74, -31]) == -
2
assert max_num([100,2,6,79,24,12,57,7,1,6,8,2,7,9]) == 100
assert max_num([-1, -2, -3, -4, -5]) == -1
assert max_num([-3, 2, 1, 3, -2, -1]) == 3
assert max_num([5]) == 5

print("Exerciseis correct.")

Bài 11
Viết hàm nhận danh sách (list) làm đối số và trả về danh sách đảo ngược. (KHÔNG sử
dụng hàm reverse() có sẵn).
Yêu cầu:
- Trong hàm sử dụng lệnh assert để kiểm tra điều kiện đầu vào là một danh sách
(list)
- Sử dụng các câu lệnh assert để kiểm thử hàm.

def reverse_list(RL: list) -> list:


'''Takes a list and returns the reversed version of the list'''
assert type(RL) == list, 'The list should be a list, not a ' +
str(type(RL))[8:-2]
reverse = []
for i in range(len(RL)):
reverse.append(RL[len(RL)-i-1])
return reverse
assert reverse_list([44,56,-1,-6,-2,19, 15, 18, 12, 97, 12, -100, -
5, 5,23]) == [23, 5, -5, -100, 12, 97, 12, 18, 15, 19, -2, -6, -1, 56,
44]
assert reverse_list(['aeiou', 'bcdfg', 'hjklm', 'npqrs', 'tvwx',
'yzfg', 'uh', 'blip']) == ['blip','uh', 'yzfg','tvwx','npqrs',
'hjklm', 'bcdfg', 'aeiou']
assert reverse_list([1, 2, 3]) == [3, 2, 1]
assert reverse_list(['a', 'b', 'c', 'd', 'e']) == ['e', 'd', 'c',
'b', 'a']
assert reverse_list([100]) == [100]
assert reverse_list([]) == []
print("Exerciseis correct.")

You might also like