Error in Python can be of two types i.e. Syntax errors and Exceptions. Errors are the problems in a program due to which the program will stop the execution. On the other hand, exceptions are raised when some internal events occur which changes the normal flow of the program.
The difference between Syntax Error and Exceptions
Syntax Error: As the name suggest this error is caused by wrong syntax in the code. It leads to the termination of the program.
#initialize the amount variable
amount = 10000
# check that You are eligible to
# purchase Dsa Self Paced or not
if(amount>2999)
print("You are eligible to purchase Dsa Self Paced")
Output:

Exceptions: Exceptions are raised when the program is syntactically correct but the code resulted in an error. This error does not stop the execution of the program, however, it changes the normal flow of the program.
#initialize the amount variable
marks = 10000
# perform division with 0
a = marks / 0
print(a)
Output:

In the above example raised the ZeroDivisionError as we are trying to divide a number by 0.
Tiếng Việt
Ngoại lệ (Exception) trong Python
Ngoại lệ (Exception) là lỗi xảy ra trong quá trình thực thi một chương trình. Khi nó xảy ra, Python tạo ra một exception để xử lý vấn đề đó tránh cho ứng dụng hay server của bạn bị crash.
Ngoại lệ có thể là bất kỳ điều kiện bất thường nào trong chương trình phá vỡ luồng thực thi chương trình đó. Bất cứ khi nào một ngoại lệ xuất hiện, chương trình sẽ ngừng thực thi, chuyển qua quá trình gọi và in ra lỗi đến khi nó được xử lý.

Xử lý ngoại lệ trong Python
Trong Python, các ngoại lệ có thể được xử lý bằng khối lệnh try…except. Nghĩa là mình nói với máy tính là chạy đoạn code này đi (try)m trừ phi(except) điều này xảy ra.
Phần thân của try sẽ gồm code có thể tạo ra exception, nếu một exception được tạo ra, tất cả câu lệnh trong khối sẽ bị bỏ qua.
Mặt khác, phần thân của except được gọi bởi exception handler, vì nó được dùng để bắt lỗi. Khối except sẽ thực hiện khi lỗi được tạo ra, không thì sẽ được bỏ qua. Bạn có thể dùng exception có sẵn trong Thư viện chuẩn Python.
Ví dụ:
# import module sys để gọi ra các ngoại lệ
import sys
randomList = ['a', 0, 2]
for nhap in randomList:
try:
print("Phần tử:", nhap)
r = 1/int(nhap)
break
except:
print("Có ngoại lệ ",sys.exc_info()[0]," xảy ra.")
print("Nhập phần tử tiếp theo")
print()
print("Kết quả với phần tử",nhap,"là:",r)
Kết quả đưa ra màn hình như sau:
Phần tử: a
Có ngoại lệ <class 'ValueError'> xảy ra.
Nhập phần tử tiếp theo
Phần tử: 0
Có ngoại lệ <class 'ZeroDivisionError'> xảy ra.
Nhập phần tử tiếp theo
Phần tử: 2
Kết quả với phần tử 2 là: 0.5
Ở ví dụ này, chương trình sẽ thực thi đến khi có chính xác số được nhập là số nguyên.
Nếu không có ngoại lệ xảy ra, khối except sẽ được bỏ qua và chương trình theo luồng bình thường, nhưng nếu có bất cứ ngoại lệ nào nó sẽ bị chặn lại bởi except.
Chương trình cũng in tên của exception bằng hàm ex_info() bên trong module sys, kết quả trả về là giá trị ‘a’ gây ra ValueError và 0 gây ra ZeroDivisionError.
Nếu bạn không dùng except, thì nếu bạn nhập giá trị “a”, hoặc số “0”. Chương trình sẽ dừng lại và báo lỗi, nhưng nếu dùng “try..except”, thì chương trinh của bạn sẽ tiếp tục chạy và những trường hợp lỗi sẽ được thông báo. Điều này giống như là khi nhập password sai được phép nhập lại vậy, nếu không dùng try except thì máy tính bạn treo luôn ngay khi bạn nhập giá trị sai.
Xử lý cụ thể một ngoại lệ
Ở ví dụ trên, không có một ngoại lệ cụ thể nào được đề cập đến trong mệnh đề except nên khi chương trình gặp ngoại lệ (dù là bất kì exception nào) thì chúng đều được xử lý theo một cách.
Ngoài cách đó ra, ta có thể chỉ định các ngoại lệ cụ thể cho khối lệnh except.
Cú pháp như sau:
try:
# khối code lệnh try
except exceptionName:
# khối code lệnh except
Tham số:
- exceptionName là tên của các exception bạn nghĩ có khả năng xảy ra.
Một mệnh đề try có thể có nhiều mệnh đề except để xử lý chúng khác nhau.
Nếu khối lệnh trong try có 1 lỗi gì đó xảy ra thì chương trình sẽ tìm đến các except phía dưới, except nào thỏa mãn thì nó sẽ thực thi code trong khối except đó.
try :
# khối code lệnh try
except ValueError:
# code xử lý ValueError
except RuntimeError:
# code xử lý RuntimeError
Bạn cũng có thể bắt nhiều exception trên một lần khai báo except bằng việc đặt các ngoại lệ cách nhau bởi một dấu phẩy ‘,’
try :
# khối code lệnh try
except (TypeError, ZeroDivisionError):
# code xử lý nhiều ngoại lệ
# TypeError, ZeroDivisionError
Xây dựng một Exception
Xây dựng một exception bằng cách sử dụng raise là một cách khác để xử lí ngoại lệ trong Python. Trong trường hợp này, bạn có thể tạo exception của riêng mình – đó là exception được nêu ra khi vấn đề nằm bên ngoài phạm vi của dự kiến lỗi xảy ra.
Ví dụ:
try:
x = input('Nhập một số trong khoảng 1-10: ')
if x<1 or x>10:
raise Exception
print 'Bạn vừa nhập một số hợp lệ :D'
except:
print 'Số bạn vừa nhập nằm ngoài khoảng cho phép mất rồi!'
Trong ví dụ này, nếu bạn nhập một số bên ngoài các phạm vi cho phép, các lệnh print trong các except block sẽ được thực hiện.
Module traceback
Module traceback là cách khác để xử lí exception trong Python. Về cơ bản nó được sử dụng để in ra dấu vết của chương trình sau khi exception xảy ra.
Traceback bao gồm thông báo lỗi, số dòng gây ra lỗi và call stack của hàm gây ra lỗi.
>>> raise KeyboardInterrupt
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise KeyboardInterrupt
KeyboardInterrupt
>>> raise MemoryError("Đây là một tham số.")
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise MemoryError("Đây là một tham số.")
MemoryError: Đây là một tham số.
>>> try:
... a = int(input("Nhập một số nguyên dương: "))
... if a <= 0:
... raise ValueError("Số bạn vừa nhập không phải số nguyên dương.")
... except ValueError as ve:
... print(ve)
...
Nhập một số nguyên dương: -2
Số bạn vừa nhập không phải số nguyên dương.
Try…Finally
Try…finally là một cách khác để viết lệnh try trong Python.
Finally còn được gọi là mệnh đề clean-up/termination vì nó luôn luôn chạy bất kể có lỗi nào xảy ra trong block try.
Thường thì các câu lệnh trong finally được dùng để thực hiện công việc giải phóng tài nguyên.
Ví dụ cho các hoạt động của file để minh họa rõ về finally:
Sau khi thực hiện xong các thao tác với file trong Python thì bạn cần đóng nó lại. Đóng file để đảm bảo quy chế đóng mở và giải phóng bộ nhớ cho chương trình.
try:
f = open("test.txt",encoding = 'utf-8')
# thực hiện các thao tác với tệp
finally:
f.close()
Bằng cách này, ta có thể yên tâm file được đóng đúng ngay cả khi phát sinh ngoại lệ khiến chương trình dừng đột ngột.
Một ví dụ khác có ngoại lệ:
mauso = input("Bạn hãy nhập giá trị mẫu số: ")
try:
ketqua = 15/int(mauso)
print("Kết quả là:",ketqua)
finally:
print("Bạn đã nhập số không thể thực hiện phép tính.")
Finally luôn luôn chạy bất kể có lỗi xảy ra hay không.
Khi bạn nhập input là 5, chương trình trả về kết quả:
Bạn hãy nhập giá trị mẫu số: 5
Kết quả là: 3.0
Bạn đã nhập số không thể thực hiện phép tính.
Và khi input là 0, kết quả hiển thị:
Bạn hãy nhập giá trị mẫu số: 0
Bạn đã nhập số không thể thực hiện phép tính.