Chủ Nhật, 29 tháng 12, 2013

Exception

1.Exception
Mặc dù một câu lệnh hoặc một biểu thức chính xác về mặt cú pháp nhưng vẫn có thể gây ra lỗi khi chạy thử. Lỗi được phát hiện trong suốt quá trình chạy thử này gọi là " Exception ", và chúng ta không bao giờ hoàn toàn tránh được các lỗi này. Hầu hết các exception không thể sử lý bằng programs. Tuy nhiên, các thông báo lỗi sẽ hiện ra:

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: cannot concatenate 'str' and 'int' objects

 ở dòng cuối thông báo chuyện gì đã xảy ra. Các Exception có nhiều loại,được in ra ở đầu các messages.
Phần còn lại sẽ thông báo chi tiết loại của exception và điều gì đã xảy ra. Nó thông báo contextexception xảy ra

2. Xử lý Exception

Có thể viết chương trình xử lý Exception được định trước. Các Exception thường được phát hiện sau khi chạy thử các trương trình hoặc do kinh nghiệm của người code khi biết chắc chắn nó sẽ xảy ra.
 Xét một ví dụ: Báo cho người dùng nhập vào cho tới khi là một số nguyên:

>>> while True:
...     try:
...         x = int(raw_input("Please enter a number: "))
...         break
...     except ValueError:
...         print "Oops!  That was no valid number.  Try again..."
...

+Đầu tiên, mệnh đề try được thực hiện
+Nếu không có Exception nào xảy ra trong suốt quá trình thực hiện mệnh đề try thì mệnh đề Except sẽ được bỏ qua
+Nếu trong quá trình thực hiện  mệnh đề try mà có exception xảy ra:
 - Nếu exception xảy ra trùng với tên exception trong mệnh đề except thì thông báo xé hiện ra và lại quay lại tiếp tục mệnh đề try
 - Nếu exception xỷ ra không trùng thì thông báo lỗi sẽ xảy ra và không thực hiện tiếp mệnh để try nữa

Một mệnh đề try có thể có nhiều hơn một mệnh đề except . Và hanhdler chỉ xử lý except xảy ra trong mệnh đề try. Một mệnh đề except có thể có nhieefy loại exception:
... except (RuntimeError, TypeError, NameError):
...     pass

 Mệnh đề except cuối cùng có thể bỏ qua tên của ngoại lệ, nhưng hãy cẩn thận vì nó có thể làm bỏ qua lỗi của chương trình

Câu lệnh Try...except còn có một mệnh đề else ở sau tất cả các mệnh đề except . Nó được dùng cho đoạn mã sẽ thực hiện nếu mệnh để Try không đưa ra bất kì một exception 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()

Sử dụng mệnh đề else giúp chúng ta ngăn ngừa  được exception ngẫu nhiên gây ra bởi mệnh đề try mà lại không được nêu ra trong mệnh đề except


3. Câu lệnh Raise 
Câu lệnh Raise cho phép tác động đến một exception cụ thể để cho nó  xảy ra:


>>> raise NameError, 'HiThere'
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: HiThere

Đối số đầu tiên đưa ra tên của exception đó, đối số thứ 2 xác định đối số của except đó

4.Exception do người dùng định nghĩa

Bằng cách tạo ra một Exception class mới, người dùng có thể tự định nghĩa một exception. Các exception thường được thừa kế từ các exception class bằng cách trực tiếp hoặc gián tiếp.

>>> class MyError(Exception):
...     def __init__(self, value):
...         self.value = value
...     def __str__(self):
...         return repr(self.value)
...
>>> try:
...     raise MyError(2*2)
... except MyError as e:
...     print 'My exception occurred, value:', e.value
...
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
__main__.MyError: 'oops!'


Trong ví dụ này, hàm __init__ bị ghi chèn lên. Một thuộc tính giá tị mới được tạo ra.  Thuộc tính này thay thế cho các cách thức mặc định tạo ra thuộc tính args

1 nhận xét: