Chủ Nhật, 28 tháng 4, 2013

syntax errors and exceptions

Trước nhất chúng ta cần phân biệt hai khái niệm lỗi cú pháp (syntax errors) và ngoại lệ (exception)

1. Syntax errors
Syntax errors được biết đến như parsing errors (lỗi phân tích cú pháp ), đây là một lỗi thường gặp khi ta bắt đầu học Python:

>>> while True print('Hello world')
  File "<stdin>", line 1, in ?
    while True print('Hello world')
                   ^
SyntaxError: invalid syntax

parser (bộ phân tích ) lập lại dòng gây lỗi, và có một mũi tên nhỏ chỉ đến phần đầu tiên gây ra lỗi. Lỗi được tạo ra bởi dấu hiệu đằng trước mũi tên: Trong ví dụ này: lỗi được tìm thấy tại print function, lí do là vì (':') bị missing trước đó. File name, và line number được in ra vì vậy bạn biết được input được lấy từ đâu. 

2. Exceptions
Ngay cả khi một statement hay là expression là đúng về mặt cú pháp, nó có thể tạo ra lỗi khi một cố gắng được tạo ra để thực thi nó. Errors được tìm thấy trong suốt quá trình thực thi được gọi là exceptions và nó không là unconditionall fatal. tuy nhiên, hầu hết exception không được handled bởi programs , và kết quả trong error messages 

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: int 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: Can't convert 'int' object to str implicitly

Dòng cuối của error message ám chỉ điều gì đã xảy ra. Các exceptions xuất hiện theo các kiểu khác nhau và kiểu được in như một phần của message, các kiểu trong ví dụ là : Zero Devision Error , NameError, TypeError. string được in như là exception type là tên của built-in exception đã xuất hiện. Đó là đúng cho tất cả built-in exceptions, nhưng nó không cần là đúng cho user-defined exceptions (mặc dù đó là convention hữu dụng). các tên ngoại lệ chuẩn là các built-in identifiers.

Phần còn lại của dòng cung cấp thông tin chi tiết dựa trên kiểu của ngoại lệ và những gì tạo ra nó. 

Phần đằng trước của error message chỉ ra ngữ cảnh nơi ngoại lệ xảy ra, trong một form của traceback stack. Nói chung nó chứa một traceback stack liệt kê source lines, tuy nhiên nó sẽ không display dòng đọc từ chuẩn input. 

3. Handling exception
Chúng ta có thể viết programs để handle selected exceptions. Nhìn vào ví dụ sau đây, những gì yêu cầu user nhập dữ liệu cho đến khi dữ liệu đó là một số nguyên hợp lệ, nhưng cho phép user interupt program  (sử dụng control-C hay bất cứ OS support), chú ý rằng interupt do user sinh ra được báo hiệu bởi việc raising KeyboardInterupt exception 

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

try statement làm việc như sau:
  • Thứ nhất, try clause  (statement(s) giữa try except  keywords ) được thực thi. 
  • Nếu không có exception xảy ra, except clause  đươc bỏ qua và thực thi try statement được hoàn thành. 
  • Nếu exception xảy ra trong suốt quá trình thực thi cảu try clause, phần còn lại của clause được bỏ qua. Sau đó nều kiểu của nó matches exception named sau except keyword, except clause được thực thi và sau đó excution sẽ tiếp tục sau try statement.
  • Nếu một exception xảy ra không match với exception named in except clause, nó được chuyển đến phía ngoài của try  statements, nếu không có handler được tìm thấy, nó là một unhandled exception  và excution stops với message được chỉ ra phía trên. 
try statement có thê có nhiều hơn một except clause  , để chỉ ra handlers cho các exceptions khác nhau. Tối đa một handler sẽ được thực thi. handlers chỉ handle exceptions mà xảy ra tương ứng với try clause. except clause có thể name nhiều exceptions trong một tuple, cho ví dụ :
... except (RuntimeError, TypeError, NameError):
...     pass


Không có nhận xét nào:

Đăng nhận xét