Trong bài viết này, Quantrimang sẽ cùng bạn tìm hiểu cách xử lý các ngoại lệ trong Python bằng cách sử dụng các câu lệnh Try, Except và Finally. Điều này sẽ thúc đẩy bạn viết code gọn gàng, dễ đọc và hiệu quả bằng Python.

Nội dung chính

  • Ngoại lệ (Exception) trong Python
  • Xử lý ngoại lệ trong Python
  • Xử lý cụ thể một ngoại lệ
  • Xây dựng một Exception
  • Try…Finally

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.

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 đã được tinhoccuaem đề cập đến trong bài giới thiệu về Exception.

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:

Phn tử: a
Có ngoi l <class 'ValueError'> xy ra.
Nhp phn t tiếp theo

Phn tử: 0
Có ngoi l <class 'ZeroDivisionError'> xy ra.
Nhp phn t tiếp theo

Phn tử: 2
Kết qu vi phn 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

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 đề exceptnê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à mt 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)
...
Nhp mt s nguyên dương: -2
S bn va nhp không phi 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ả:

Bn hãy nhp giá tr mu số: 5
Kết qu là: 3.0
Bn đã nhp s không th thc hin phép tính.

Và khi input là 0, kết quả hiển thị:

Bn hãy nhp giá tr mu số: 0
Bn đã nhp s không th thc hin phép tính.

Vậy là Tin học của em đã giới thiệu cho bạn xong về các cách cơ bản để xử lý ngoại lệ trong Python rồi. Mong rằng bài viết sẽ đem lại hữu ích cho các bạn.

180 BÌNH LUẬN

  1. Please let me know if you’re looking for a author for your site.
    You have some really great posts and I think I would be a good asset.
    If you ever want to take some of the load off, I’d love to write
    some material for your blog in exchange for a link back to mine.
    Please blast me an email if interested. Kudos!

  2. I’d like to thank you for the efforts you have put in penning this website.

    I really hope to check out the same high-grade content by you later on as well.
    In truth, your creative writing abilities has encouraged me to get my own, personal blog now
    😉

  3. Great weblog here! Additionally your web site lots up fast!
    What web host are you the usage of? Can I get your associate hyperlink to your host?
    I desire my website loaded up as quickly as yours lol

  4. Do you have a spam problem on this website; I also am a blogger,
    and I was wanting to know your situation; many of us have
    created some nice practices andd we are ooking tto swap strategies with other folks, why not
    shoot me an e-mail if interested.

  5. I’m extremely pleased to discover this great site.
    I wanted to thank you for ones time just for
    this wonderful read!! I definitely savored every bit of it and i
    also have you saved to fav to see new stuff on your web site.

  6. Appreciating the commitment you put into your blog and
    detailed information you offer. It’s nice to come across a blog every once
    in a while that isn’t the same old rehashed material. Great read!
    I’ve saved your site and I’m adding your RSS feeds to my Google account.

  7. I was suggested this blog by my cousin. I am not sure whether this post
    is written by him as no one else know such detailed about my trouble.
    You are wonderful! Thanks!

  8. Pretty component of content. I just stumbled upon your blog and in accession capital to assert that I get actually enjoyed account your blog posts.
    Anyway I’ll be subscribing to your feeds and even I fulfillment you get admission to persistently fast.

  9. xnK5uZ It`s really useful! Looking through the Internet you can mostly observe watered down information, something like bla bla bla, but not here to my deep surprise. It makes me happy..!

  10. Terrific paintings! This is the kind of info that are supposed to be shared around the net. Disgrace on Google for not positioning this put up higher! Come on over and visit my site. Thank you =)

  11. Terrific paintings! That is the type of information that should be shared around the net. Shame on Google for not positioning this submit higher! Come on over and visit my site. Thank you =)

  12. you are really a good webmaster. The site loading pace is amazing. It seems that you are doing any unique trick. In addition, The contents are masterpiece. you have done a great task on this matter!

  13. I?d should verify with you here. Which is not something I often do! I take pleasure in reading a publish that may make individuals think. Also, thanks for allowing me to comment!

  14. Hey! Quick question that’s completely off topic.
    Do you know how to make your site mobile friendly?
    My weblog looks weird when browsing from my apple iphone.
    I’m trying to find a theme or plugin that might be able to fix this issue.
    If you have any recommendations, please share.
    Cheers!

  15. Wow, wonderful blog layout! How long have you been blogging for? you make blogging look easy. The overall look of your site is great, as well as the content!. Thanks For Your article about sex.

  16. I will immediately clutch your rss feed as I can at find your email subscription link or newsletter service. Do you have any? Kindly permit me recognize in order that I may just subscribe. Thanks.

  17. You have made some really good points there. I checked on the web for more info about the issue and found most individuals will go along with your views on this site.

  18. You could certainly see your enthusiasm within the work you write. The arena hopes for more passionate writers like you who are not afraid to mention how they believe. All the time follow your heart.

  19. You can certainly see your skills within the work you write. The arena hopes for even more passionate writers such as you who aren at afraid to say how they believe. All the time go after your heart.

  20. You’re so interesting! I do not think I have
    read something like that before. So wonderful to find another person with unique thoughts on this issue.
    Really.. many thanks for starting this up. This website is one thing
    that’s needed on the internet, someone with some originality!

  21. Su salud y su calidad de vida son buenas razones para hablar con un médico. Fármacos: Los fármacos indicados como tratamiento para la disfuncion erectil tienen el accionar del conocido viagra y se toman en el momento del coito para poder conseguir una erección. La disfunción eréctil puede ser el resultado de un problema con alguno de dichos factores.

  22. Las ventajas de este sistema son muchas: no se ve, la impotencia se resuelve de manera permanente, la erección es muy duradera (tanto tiempo como se desee), permite una mayor espontaneidad en cuanto al momento de mantener una relación sexual, no interfiere con la eyaculación o el orgasmo de la mujer, y además no falla nunca.

  23. Wow! This could be one particular of the most helpful blogs We have ever arrive across on this subject. Actually Great. I am also a specialist in this topic therefore I can understand your effort.

  24. Howdy! This is my first comment here so I just wanted to
    give a quick shout out and tell you I really enjoy reading
    through your articles. Can you recommend any other blogs/websites/forums that go over the same subjects?

    Thanks a ton!

  25. Hey! This post couldn’t be written any better! Reading through this
    post reminds me of my old room mate! He always kept chatting about this.
    I will forward this page to him. Pretty sure
    he will have a good read. Thanks for sharing!

  26. Someone essentially assist to make significantly articles I might state.
    This is the first time I frequented your website page and to this point?

    I surprised with the analysis you made to create this actual put up incredible.
    Great task!

  27. Howdy are using WordPress for your site platform? I’m new to the blog world but I’m trying to get
    started and set up my own. Do you need any coding expertise to make your
    own blog? Any help would be really appreciated!

  28. Wonderful blog! I found it while browsing on Yahoo News.
    Do you have any suggestions on how to get listed in Yahoo News?
    I’ve been trying for a while but I never seem to get there!
    Thank you

  29. You can definitely see your expertise in the work you write. The world hopes for even more passionate writers like you who are not afraid to say how they believe. Always go after your heart.

  30. Secondary moment My partner and i acquired and then both of those events happy with %anchor% When important I most certainly will arrangement as a result supplier once again..Fantastic occupation.

  31. This awesome blog is no doubt interesting and besides informative. I have found helluva interesting things out of this amazing blog. I ad love to go back every once in a while. Thanks a lot!

  32. I simply could not depart your web site prior to suggesting that I extremely enjoyed the standard info a person provide on your guests? Is going to be again often in order to check out new posts

THOÁT KHỎI BÌNH LUẬN

Please enter your comment!
Please enter your name here