# Exceptions
Trong phần nà y chúng ta sẽ nghiên cứu vá» exception trong Python và là m sao Äá» xá» lý trong trong code.
Má»t sá» lá»i xảy ra trong quá trình chạy chương trình ÄÆ°á»£c gá»i là exception. Má»i má»t exception Äá»u sinh ra má»t sá» thông báo lá»i.
NameError
Khi chúng ta bắt Äầu viết code, Äây sẽ là hầu hết các exceoption mà các bạn có thá» tìm thấy. Và dụ như chúng ta cá» gắng truy cáºp và o biến và nó chưa ÄÆ°á»£c khai báo.
```text
>>> print kushal
Traceback (most recent call last):
File "", line 1, in
NameError: name 'kushal' is not defined
```
Dòng cuá»i cùng chứa ná»i dung cụ thá» cá»§a thông báo lá»i, phần còn lại ÄÆ°a ra thông báo cụ thá» là m thế nà o Äá» nó xảy ra \( hoặc những gì gây ra ngoại lá»\).
TypeError
TypeError là má»t trong các lá»i phá» biến nhất xuất hiá»n. Nó thưá»ng xuất hiá»n vá»i các chương trình liên quan Äến kiá»u dữ liá»u. Và dụ:
```text
>>> print 1 + "kushal"
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'int' and 'str'
```
Là m sao Äá» xá» lý exceptions?
Chúng ta sá» dụng cú pháp try... except Äá» xá» lý exception. Cú pháp cÆ¡ bản như sau:
```text
try:
statements to be inside try clause
statement2
statement3
...
except ExceptionName:
statements to evaluated in case of ExceptionName happens
```
Nó là m theo các bưá»c sau:
```text
First all lines between try and except statements.
If ExceptionName happens during execution of the statements then except clause statements execute
If no exception happens then the statements inside except clause does not execute.
If the Exception is not handled in the except block then it goes out of try block.
```
Và dụ sau sẽ thá»±c hiá»n ká»ch bản trên.
```text
>>> def get_number():
... "Returns a float number"
... number = float(raw_input("Enter a float number: "))
... return number
...
>>>
>>> while True:
... try:
... print get_number()
... except ValueError:
... print "You entered a wrong value"
...
```
```text
Enter a float number: 45.0
45.0
Enter a float number: 24,0
You entered a wrong value
Enter a float number: Traceback (most recent call last):
File "", line 3, in
File "", line 3, in get_number
```
KeyboardInterrupt
Trong lần nháºp giá trá» Äầu tiên chúng ta nháºp và o sá» thá»±c, và sau Äó in nó ra mà n hình, sau Äó chúng ta sẽ ÄÆ°a và o dấu phẩy trong sá» thá»±c, và sẽ có lá»i khi chúng ta là m như váºy.
Trong lần thứ 3 chúng ta ấn tá» hợp phÃm ctrl +C sẽ xuất hiá»n má»t lá»i là KeyboardInterrupt, sẽ không có má»t exception nà o.
Sẽ có má»t cách Äá» tá»ng hợp lại tất cả các exception Äó. Và dụ các bạn có thá» xem dưá»i Äây:
```text
>>> try:
... raw_input() # Press Ctrl+c for a KeyboardInterrupt
... except:
... print "Unknown Exception"
...
Unknown Exception
```
Raising exceptions
```text
>>> raise ValueError("A value error happened.")
Traceback (most recent call last):
File "", line 1, in
ValueError: A value error happened.
```
Chúng ta có thá» bắt exception như má»t exception bình thưá»ng.
```text
>>> try:
... raise ValueError("A value error happened.")
... except ValueError:
... print "ValueError in our code."
...
ValueError in our code.
```
Using finally for cleanup
Nếu chúng ta muá»n có má»t và i báo cái má»i khi thá»±c hiá»n trong má»i hoà n cảnh, chúng ta có thá» sá» dụng má»nh Äá», nó sẽ chạy trưá»c khi kết thúc biá»u thức.
```text
>>> try:
... fobj = open("hello.txt", "w")
... res = 12 / 0
... except ZeroDivisionError:
... print "We have an error in division"
... finally:
... fobj.close()
... print "Closing the file object."
...
We have an error in division
Closing the file object.
```
Trong và dụ nà y chúng ta Äảm bảo chắc chắn rằng táºp tinÄÆ°á»£c má», Äóng. Chúc bạn thà nh công!