Bài 17. Ngoại lệ/cảnh báo
Tác giả: Trần Thanh Tùng
Nội dung kiến thức
1. Ngoại lệ (exception)
- Python sử dụng một đối tượng đặc biệt gọi là
exception
để quản lý lỗi xảy ra trong quá trình thực hiện chương trình. - Một lỗi đơn giản là khi bạn chia một số cho 0 và cần phải bắt ngoại lệ đó.
>>> print(2/0) Traceback (most recent call last): File "<stdin>", line 1, in <module> ZeroDivisionError: division by zero
1.1. Từ khóa raise
- Sử dụng
raise
để bắt một ngoại lệ nếu điều kiện xảy ra. - Để bắt một ngoại lệ khi điều kiện chắc chắn xảy ra thì sử dụng
raise
có thể như ví dụ dưới đây.x = -2 if x < 0: raise Exception("Numbers below zero")
- Khi bạn thực thi code:
...> python test.py Traceback (most recent call last): File "...\test.py", line 4, in <module> raise Exception("Numbers below zero") Exception: Numbers below zero
1.2. Từ khóa assert
-
Sử dụng
assert
khi nhất định điều kiện đó phải đáp ứng.def average(scores): assert len(scores) != 0 return sum(scores)/len(scores) score = [] print("Average of score:", average(score))
Output:
... AssertionError
1.3. try
and except
- Khối
try
andexcept
được sử dụng để bắt (catch) và xử lý (handle) ngoại lệ.try: print(a) except NameError: print("Variable a is not defined")
- Từ khóa
else
định nghĩa cho một khối code để thực thi nếu không có lỗi nào.else: print("Nothing went wrong!")
- Khối
finally
nếu được chỉ định thì sẽ thực thi bất kể khốitry
dù có gây ra lỗi hay không.finally: print("Hello!")
- Ví dụ khác
fruitsPrice = { 'Apple': 5, 'Orange': 7, 'Banana': 9 } key = None while True: try: key = input('Enter a key:') fruit = fruits[key.lower()] except KeyError: print(f'{key} does not exist.') except KeyboardInterrupt: break else: print(fruit) finally: print('Press Ctrl-C to exit.')
2. Cảnh báo (warning)
warning
được đưa ra để cảnh báo về các tình huống không nhất thiết phải ngoại lệ.- Cảnh báo khác với một lỗi trong chương trình. Chương trình dừng ngay nếu khi gặp lỗi nhưng một cảnh báo mà không quan trọng thì nó hiển thị thông báo và chương trình vẫn chạy.
import warnings # displaying warning warnings.warn('This is a warning message!')
test.py:4: UserWarning: This is a warning message! warnings.warn('This is a warning message!')
3. Gỡ lỗi (debugging)
3.1. Sử dụng breakpoint()
- Ví dụ với 1 file có tên là
divisionCaculator.py
def division(a, b): breakpoint() result = a / b return result print(division(12, 0))
- Trong terminal
....> python divisionCaculator.py > ...\divisioncaculator.py(3)division() -> result = a / b (Pdb)
3.2. Sử dụng pdb module
PDB
là Python Debugger. Để sử dụngpdb
thì cần phảiimport pdb
và sử dụng phương thứcset_trace()
.import pdb import os def getPath(file): """Return file's path or empty string if no path.""" head, tail = os.path.split(file) return head filename = __file__ pdb.set_trace() filenamePath = getPath(filename) print(f'Path: {filenamePath}')
- Một số lệnh trong
pdb
cần thiếtc
: tiếp tục thực thi.q
: thoát khỏi gỡ lỗi/ thực thi.n
: sang dòng tiếp theo trong cùng một hàm.s
: sang dòng tiếp theo trong hàm này hoặc một hàm được gọi.
Nội dung trên chỉ là tóm tắt, học viên cần đọc các tài liệu liệt kê trong phần tài liệu tham khảo dưới đây.
Tài liệu tham khảo
Tài liệu chính
- PythonCrashCourse (trang 194-202)
- Ngoại lệ trong Python
- Gỡ lỗi trong Python
Tài liệu bổ sung
- Một trao đổi trên stackoverflow