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
   59   60   61   62   63   64   65   66   67   68   69