Trong khi viết một chương trình một vấn đề rất quan trọng mà các lập trình viên quan tâm đó là: quản lý lỗi xuất hiện trong chương trình. Người lập trình cần ràng buộc tình huống có khả năng xảy ra lỗi, điều này rất khó có thể tính toán được toàn vẹn hết vì không một chương trình nào có thể dự đoán chính xác đầy đủ các lỗi sẽ xảy ra và khi xảy ra lỗi chương trình sẽ xử lý như thế nào. Để giải quyết rong bài viết này chúng tôi sẽ giới thiệu các kỹ thuật dùng để bắt lỗi và bẫy lỗi khi lập trình Python.
Các lỗi thường gặp trong chương trình.
1. Lỗi cú pháp
Python chỉ có thể thực hiện được một chương trình với những câu lệnh đúng theo cú pháp, nếu không, trình thông dịch sẽ đưa ra thông báo lỗi. Trong Python, Nếu trong chương trình có bất cứ lỗi cú pháp nào, Python sẽ hiển thị thông báo lỗi và dừng chạy chương trình.
2. Lỗi thực thi
Dạng thứ hai là lỗi thực thi xuất hiện khi chương trình đã bắt đầu chạy. Những lỗi kiểu này được gọi là biệt lệ bởi vì chúng thường chỉ những điều kiện bất thường phát sinh.
3. Lỗi ngữ nghĩa
Dạng thứ ba là lỗi ngữ nghĩa. Trong trường hợp có lỗi kiểu này, chương trình vẫn chạy thông theo nghĩa máy và không phát thông báo lỗi, nhưng sẽ không thực hiện đúng yêu cầu mong muốn
Trong 3 dạng lỗi trên, dạng 1 chúng ta
sẽ xử lý nhờ các trình biên dịch. Khi xảy ra lỗi dạng 1 này sẽ không thông dịch được và công cụ sẽ thông báo. Dạng 3 hầu như phụ thuộc vào kinh nghiệm và kỹ thuật của người lập trình vì nó không thông báo. Chúng ta chỉ có thể phát hiện bằng cách thực hiện các test case. Đối với dạng 2, khi lập trình chúng ta phải quản lý được lỗi và ràng buộc tốt. Vì vậy trong khi lập trình chúng ta phải quản lý các Exception, chúng là sự kiện xảy ra khi một chương trình đang chạy mà phát sinh ra lỗi. Nó sẽ làm
gián đoạn chương trình. Có nhiều loại lỗi có thể là lí do của Exception - bao gồm từ lỗi của phần cứng, như hỏng ổ cứng, đến những lỗi do lập trình, như là truy cập đến một phần tử ngoài giới hạn đã khai báo...
Tại sao phải sử dụng Exceptions
Chương trình nào cũng có lỗi, khác nhau ở chổ ít hay nhiều. Để viết một chương trình có ít lỗi nhất đến cho người dùng là điều mà các lập trình viên luôn mong muốn. Để hạn chế tối đa được lỗi trong chương trình, lập trình viên phải sử dụng các kỹ thuật bẫy lỗi để xử lý các exception handler
Các loại Exception phổ biến khi lập trình
1. IO Error
Xảy ra nếu khi tập tin không mở được.
2. Import Error
Nếu Python không tìm thấy được module
3. Value Error
Xảy ra khi một toán tử hoặc hàm trả về không thích hợp
4. Keyboard Interrupt
Xảy ra khi người dùng nhấn phím ngắt [Control-C hoặc Delete]
5. EOF Error
Xảy ra khi sử dụng hàm input hoặc raw_input và gặp end-of-file [EOF] khi đọc tập tin.
Các thông báo thông dụng khi gặp các lỗi trên
except IOError:
print['An error occurred trying to read the file.']except ValueError:
print['Non-numeric data found in the file.']except ImportError:
print "NO module found"except EOFError:
print['Why did you do an EOF on me?']except KeyboardInterrupt:
print['You cancelled the operation.']except:
print['An error occurred.']
Cách cài đặt và bẫy lỗi trong Python
Cấu trúc đơn giản nhất
try: some statements here
except: exception handling
Những đoạn code có khả năng xảy ra lỗi sẽ đặt trong Try
Thông báo lỗi sẽ đặt trong except
Nếu một biệt lệ xảy ra, phần trong Try sẽ được bỏ qua và thực hiện trong phần Except
Sau đây là một số ví dụ thực
hành
Ví dụ 1.
Ví dụ về lỗi của chương trình
1 [x,y] = [5,0]
2 z = x/y
Chương trình trên khi chạy sẽ có lỗi vì mẫu bằng 0
Khi viết đoạn chương trình trên ta phải sử dụng kỹ thuật bẫy lỗi. Đoạn chương trình được viết lại như sau:
1 [x,y] = [5,0]
2 try:
3 z = x/y
4 except ZeroDivisionError:
5 print "divide by zero"
Khi đó chương trình
chạy nếu có lỗi sẽ hiển thị divide by zero
Nếu chúng ta muốn kiểm tra code trong chương trình sẽ xuất ra màn hình như thế nào. Chúng ta chỉnh sửa lại chương trình như sau:
1 [x,y] = [5,0]2 try:3 z = x/y4 except ZeroDivisionError, e:5 z = e6 print z
Khi đó tại dòng 5. Gán z = e khi đó biến z sẽ thay thế ngoại e để hiển thị ra màn hình khi chạy lệnh Print ở dòng 6
# representation: ""
# output: "integer division or modulo by zero"
Ví dụ 2.
Chương trình
number = int[raw_input["Enter a number between 1 - 10"]]
print "you entered number", number
Nếu bạn nhập từ 1 đến 10 thì không có chuyện gì xảy ra. Nhưng nếu bạn gặp chữ Hello
Chương trình sẽ báo lỗi
Traceback [most recent call last]:
File "enter_number.py", line 1, in
number = int[raw_input["Enter a number between 1 - 10 "]]
ValueError: invalid literal for int[] with base 10: 'hello'
Do đó chúng ra sẽ cải thiện lại như sauimport sys
print "Lets fix the previous code with exception handling"
try:
number = int[raw_input["Enter a number between 1 - 10 "]]except ValueError:
print "Err.. numbers only"
sys.exit[]print "you entered number ", number
Bài viết mô tả cách cơ bản nhất để bẫy lỗi khi sử dụng ngôn ngữ Python, ngoài ra trong ngôn ngữ Python còn có các kỹ thuật nâng cao hơn khi xử lý lỗi. Các nội dung trên sẽ được trình bày trong các bài sau. Chúc các bạn trải nghiệm thành công.
Huỳnh Phước Hải