Page 64 - Python Simple
P. 64
8. Lỗi và biệt lệ http://www.vithon.org/tutorial/2.5/node10.html
Vế except cuối cùng có thể bỏ qua tên biệt lệ, có tác dụng như là một thay thế
(wildcard). Phải hết sức cẩn trọng khi dùng nó, vì nó có thể dễ dàng che đi lỗi lập
trình thật! Nó cũng có thể được dùng để in thông báo lỗi và sau đó nâng biệt lệ lại
(re-raise exception) (nhằm cho phép nơi gọi xử lý biệt lệ):
import sys
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError, (errno, strerror):
print "I/O error(%s): %s" % (errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
try ... except (câu lệnh) có một vế elsekhông bắt buộc, mà khi có mặt sẽ phải đi sau
tất cả các vế except. Nó dùng cho mã sẽ được thực thi nếu vế try không nâng biệt lệ
nào. Ví dụ:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print 'cannot open', arg
else:
print arg, 'has', len(f.readlines()), 'lines'
f.close()
Việc dùng vế else tốt hơn là thêm mã vào vế try vì nó tránh việc vô tình bắt một
biệt lệ không được nâng từ mã được bảo vệ trong câu lệnh try ... except .
Khi một biệt lệ xảy ra, nó có thể có một giá trị gắn liền, còn được biết đến như là
thông sốcủa biệt lệ. Sự có mặt và kiểu của thông số phụ thuộc vào kiểu biệt lệ.
Vế except có thể chỉ định một biến sau một (hoặc một bộ) tên biệt lệ. Biến đó được
gán với một trường hợp biệt lệ (exception instance) với các thông số chứa trong
instance.args. Để thuận tiện, trường hợp biệt lệ định nghĩa __getitem__ và
__str__ để cho các thông số có thể được truy xuất và in ra trực tiếp mà không phải
tham chiếu .args.
Nhưng việc dùng .args đã không được khuyến khích. Thay vào đó, cách dùng tốt
nhất là truyền một thông số đơn lẻ vào một biệt lệ (có thể là một bộ nếu có nhiều
thông số) và gán nó vào thuộc tính message . Ta cũng có thể tạo một biệt lệ trước và
thêm các thuộc tính vào nó trước khi nâng.
>>> try:
... raise Exception('spam', 'eggs')
... except Exception, inst:
... print type(inst) # the exception instance
... print inst.args # arguments stored in .args
3 of 7 08/31/2011 10:27 AM