Posted in C++/Python

Exception Handling

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.


Ā 

Author:

My name is Truong Thanh, graduated Master of Information Technology and Artificial Intelligent in Frankfurt University,Germany. I create this Blog to share my experience about life, study, travel...with friend who have the same hobbies.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s