Một ngoại lệ là một sự kiện xảy ra trong quá trình thực thi chương trình làm gián đoạn luồng hướng dẫn bình thường của chương trình. Nói chung, khi một script Python gặp phải tình huống mà nó không thể xử lý, nó raise một ngoại lệ. Một ngoại lệ là một đối tượng Python đại diện cho một lỗi.
Khi một script Python raise một ngoại lệ, nó phải xử lý ngoại lệ đó ngay lập tức, nếu không nó sẽ chấm dứt và thoát.
Xử lý ngoại lệ
Nếu bạn có đoạn mã nghi ngờ có thể raise ngoại lệ, bạn có thể bảo vệ chương trình bằng cách đặt đoạn mã đó trong khối try. Sau khối try:, bao gồm câu lệnh except, theo sau là khối mã xử lý vấn đề một cách khéo léo nhất có thể.
Cú pháp
Dưới đây là cú pháp đơn giản của các khối try....except...else:
try:
You do your operations here;
......................
except ExceptionI:
If there is ExceptionI, then execute this block.
except ExceptionII:
If there is ExceptionII, then execute this block.
......................
else:
If there is no exception then execute this block.
Dưới đây là một số điểm quan trọng về cú pháp trên:
- Một câu lệnh try đơn lẻ có thể có nhiều câu lệnh except. Điều này hữu ích khi khối try chứa các câu lệnh có thể ném các loại ngoại lệ khác nhau.
- Bạn cũng có thể cung cấp mệnh đề except chung, xử lý bất kỳ ngoại lệ nào.
- Sau các mệnh đề except, bạn có thể bao gồm mệnh đề else. Mã trong khối else thực thi nếu mã trong khối try không raise ngoại lệ.
- Khối else là nơi tốt cho mã không cần sự bảo vệ của khối try.
Ví dụ 1
Ví dụ này mở file, ghi nội dung vào file và thoát nhẹ nhàng vì không có vấn đề gì:
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can't find file or read data"
else:
print "Written content in the file successfully"
fh.close()
Kết quả
Điều này tạo ra kết quả sau:
Written content in the file successfully
Ví dụ 2
Ví dụ này cố gắng mở file mà bạn không có quyền ghi, nên nó raise ngoại lệ:
#!/usr/bin/python
try:
fh = open("testfile", "r")
fh.write("This is my test file for exception handling!!")
except IOError:
print "Error: can't find file or read data"
else:
print "Written content in the file successfully"
Kết quả
Điều này tạo ra kết quả sau:
Error: can't find file or read data
Mệnh đề except không có ngoại lệ
Bạn cũng có thể sử dụng câu lệnh except không có ngoại lệ được định nghĩa như sau:
try:
You do your operations here;
......................
except:
If there is any exception, then execute this block.
......................
else:
If there is no exception then execute this block.
Loại câu lệnh try-except này bắt tất cả các ngoại lệ xảy ra. Việc sử dụng loại này không được coi là thói quen lập trình tốt, vì nó bắt tất cả ngoại lệ nhưng không làm cho lập trình viên xác định được nguyên nhân gốc rễ của vấn đề.
Mệnh đề except với nhiều ngoại lệ
Bạn cũng có thể sử dụng cùng câu lệnh except để xử lý nhiều ngoại lệ như sau:
try:
You do your operations here;
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
If there is any exception from the given exception list,
then execute this block.
......................
else:
If there is no exception then execute this block.
Mệnh đề try-finally
Bạn có thể sử dụng khối finally cùng với khối try. Khối finally là nơi đặt bất kỳ mã nào bắt buộc phải thực thi, चाहे khối try có raise ngoại lệ hay không. Cú pháp của câu lệnh try-finally như sau:
try:
You do your operations here;
......................
Due to any exception, this may be skipped.
finally:
This would always be executed.
......................
Bạn không thể sử dụng mệnh đề else cùng với mệnh đề finally.
Ví dụ
#!/usr/bin/python
try:
fh = open("testfile", "w")
fh.write("This is my test file for exception handling!!")
finally:
print "Error: can't find file or read data"
Kết quả
Nếu bạn không có quyền mở file ở chế độ ghi, thì sẽ cho kết quả sau:
Error: can't find file or read data
Cùng ví dụ có thể viết gọn gàng hơn như sau:
Ví dụ
#!/usr/bin/python
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can't find file or read data"
Khi một ngoại lệ bị ném trong khối try, thực thi ngay lập tức chuyển sang khối finally. Sau khi tất cả câu lệnh trong khối finally được thực thi, ngoại lệ được raise lại và được xử lý trong các câu lệnh except nếu có trong lớp try-except ở tầng cao hơn.