Hướng dẫn python exception handling - xử lý ngoại lệ python

Hướng dẫn python exception handling - xử lý ngoại lệ python

Đã đăng vào thg 3 30, 2018 3:44 CH 3 phút đọc 3 phút đọc

Overview

Trong python cũng như tất các các ngôn ngữ lập trình khác, những trường hợp ngoại lệ luôn có thể xảy ra gây ra lỗi. Với các lỗi nhỏ không ảnh hưởng đến performance của app có thể chúng ta không để ý nhưng đôi khi xuất hiện một số lỗi có thể gây ra crash hoặc khiến server downtime. Trong bài này chúng ta sẽ đi tìm hiều cách mà Python xử lý khi có lỗi xảy ra.

What is an Exception?

Exception là một 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.

Why use Exceptions ?

Exceptions là một phương thức hết sức đơn giản để các bạn có thể handle những lỗi có thể xảy ra trong code của bạn. Khi bạn nghĩ đoạn code của bạn có thể gây ra lỗi bạn có thể sử dụng exceptions để detect và handle chúng.

Exception Errors

Dưới đây là một số exception phổ biến trong Python: IOError Thường thì lỗi này liên quan đến tệp tin của bạn, có thể nó đã bị lỗi và không thể nào mở được.

ImportError Lỗi này thường gặp khi python không thể nào tìm thấy module khi bạn thực hiện import chúng.

ValueError Lỗi này xảy ra khi bạn truyền giá trị vào một function với đúng kiểu dữ liệu nhưng giá trị của nó lại không thích hợp.

Exception Errors Examples

Để in ra chi tiết một số lỗi cơ bản trong python các bạn có thể làm như sau: Lấy một số ví dụ:

except IOError:
    print('An error occurred trying to read the file.')

except ValueError:
    print('Non-numeric data found in the file.')

except ImportError:
    print "NO module found"

except EOFError:
    print('Why did you do an EOF on me?')

except KeyboardInterrupt:
    print('You cancelled the operation.')

except:
    print('An error occurred.')

Set up exception handling blocks

Để sử dụng exception handling in Python, đầu tiên bạn cần phải làm sao detect được các ngoại lệ có thể phát sinh trong đoạn code của bạn. Trong python bạn có thể sử dụng từ khoá "try" và "except" để bắt toàn bộ ngoại lệ có thể xảy ra trong một khối code của bạn.

Khối lệnh năm giữa "try" và "except" nếu xảy ra lỗi nó sẽ gọi ra trong block except tại đây chúng ta sẽ handle nó. Ví dụ:

try:
    some statements here
except:
    exception handling

Hoặc đơn giản nhất bạn có thể test như sau :3

try:
    print 1/0

except ZeroDivisionError:
    print "You can't divide by zero, you're silly."

How does it work?

Việc xử lý lỗi được thực hiện thông qua việc sử dụng exceptions, Nó được thực thi trong try block và nếu bất có bất kỳ lỗi nào xảy ra nó sẽ được handle trong except block.

In addition to using an except block after the try block, you can also use the finally block. Ngoài ra ngoài việc sử dụng try để detect exception và xử lý chúng trong except thì bạn cũng thể xử dụng một block khác mà python cung cấp cho bạn đó là finally.

Đoạn code trong finally sẽ được thực thi bất kể khi có exception xảy ra.

mport sys

print "Lets fix the previous code with exception handling"
try:
    number = int(raw_input("Enter a number between 1 - 10 "))

except ValueError:
    print "Err.. numbers only"
    sys.exit()

print "you entered number ", number

Try ... finally clause

Finally là không bắt buộc. Nó được thêm vào với mục đích thực hiện một số tác vụ bất kể trong trường hợp có ngoại lệ xả ra.

try:
    raise KeyboardInterrupt
finally:
    print 'Goodbye, world!'
...

Trong bài mình có đưa ra một số các cơ bản để handle các ngoại lệ có thể xảy ra trong quá trình phát triển phần mềm sử dụng ngôn ngữ python. Mong rằng nó giúp ích được các bạn.

All rights reserved

Nếu bạn viết code trên để xử lý một exception đơn, bạn có thể có một biến theo sau tên của exception trong lệnh except. Nếu bạn đang khai báo nhiều exception thì bạn có một biến theo sau tuple của các exception đó.

Ví dụ của một exception đơn:

Tạo một Exception trong Python

Bạn có thể ném tường minh một Exception trong Python bởi sử dụng lệnh raise. Cú pháp của lệnh raise như sau:

Ở đây, Lop_Exception là kiểu của exception và tham số value (tùy ý) là một giá trị. Để truy cập giá trị này thì từ khóa as được sử dụng.

Trong ví dụ trên, e được sử dụng như là một biến tham chiếu mà lưu trữ giá trị của exception.

try:
   Ban thuc hien cac hoat dong cua minh tai day;
   Va day la phan code co the tao exception;
   ......................
except ExceptionI:
   Neu co ExceptionI, thi thuc thi khoi code nay
except ExceptionII:
   Neu co ExceptionII, thi thuc thi khoi code nay
   ......................
else:
   Neu khong co exception nao thi thuc thi khoi code nay 

Ghi chú: để bắt một exception, một mệnh đề except phải tham chiếu tới cùng exception đã được ném. Ví dụ, để bắt exception trên, chúng ta phải viết mệnh đề except như sau:

  • Custom Exception trong Python
  • Python cho phép bạn tạo riêng cho mình các exception bằng cách kế thừa các lớp từ các Standard Exception.
  • Ví dụ dưới đây liên quan tới RuntimeError. Ở đây, một lớp đã tạo là lớp con của của RuntimeError. Trong khối try, exception được định nghĩa bởi người dùng được tạo và được bắt trong khối except. Biến e được sử dụng để tạo một instance của lớp Networkerror.
  • Sau khi định nghĩa lớp trên, bạn có thể tạo exception như sau:

Ví dụ

Nếu bạn không có quyền mở file trong chế độ ghi, thì code trên sẽ cho kết quả:

try:
   fh = open("testfile", "w")
   fh.write("Day la mot kiem tra nho ve xu ly ngoai le!!")
except IOError:
   print "Error: Khong tim thay file"
else:
   print "Thanh cong ghi noi dung vao file"
   fh.close()

Error: Khong tim thay file

Thanh cong ghi noi dung vao file

Ví dụ

Nếu bạn không có quyền mở file trong chế độ ghi, thì code trên sẽ cho kết quả:

try:
   fh = open("testfile", "r")
   fh.write("Day la mot kiem tra nho ve xu ly ngoai le!!")
except IOError:
   print "Error: Khong tim thay file"
else:
   print "Thanh cong ghi noi dung vao file"

Error: Khong tim thay file

Error: Khong tim thay file

Ví dụ trên có thể được viết rõ ràng hơn như sau:

Khi một exception được ném trong khối try, thì trình thực thi ngay lập tức truyền tới khối finally. Sau đó tất cả các lệnh trong khối finally được thực thi, exception được tạo lại lần nữa và được xử lý bởi lệnh except nếu có mặt trong lớp trên tiếp theo của lệnh try-except.

Cú pháp

try:
    some statements here
except:
    exception handling

0

Mệnh đề except với nhiều exception trong Python

Sử dụng cùng lệnh except như trên, bạn có thể khai báo nhiều exception như sau:

try:
    some statements here
except:
    exception handling

1

Khối try-finally trong Python

Trong trường hợp nếu có bất kỳ code nào mà người dùng muốn được thực thi, dù cho có xuất hiện exception hay không thì khối code đó có thể được đặt trong khối finally. Khối finally sẽ luôn luôn được thực thi bất chấp có hay không exception. Cú pháp của khối try-finally là:

try:
    some statements here
except:
    exception handling

2

Ghi chú: Bạn có thể cung cấp một hoặc nhiều mệnh đề except, hoặc một mệnh đề finally, nhưng không được cung cấp cả hai. Ngoài ra bạn cũng không thể sử dụng mệnh đề else với một mệnh đề finally.: Bạn có thể cung cấp một hoặc nhiều mệnh đề except, hoặc một mệnh đề finally, nhưng không được cung cấp cả hai. Ngoài ra bạn cũng không thể sử dụng mệnh đề else với một mệnh đề finally.

Ví dụ

try:
    some statements here
except:
    exception handling

3

Nếu bạn không có quyền mở file trong chế độ ghi, thì code trên sẽ cho kết quả:

Error: Khong tim thay file

Ví dụ trên có thể được viết rõ ràng hơn như sau:

try:
    some statements here
except:
    exception handling

5

Khi một exception được ném trong khối try, thì trình thực thi ngay lập tức truyền tới khối finally. Sau đó tất cả các lệnh trong khối finally được thực thi, exception được tạo lại lần nữa và được xử lý bởi lệnh except nếu có mặt trong lớp trên tiếp theo của lệnh try-except.

Tham số của một Exception trong Python

Một Exception có thể có một tham số, mà là một giá trị mà cung cấp thông tin bổ sung về vấn đề. Nội dung của tham số là đa dạng tùy vào các exception. Dưới đây là cú pháp:

try:
    some statements here
except:
    exception handling

6

Nếu bạn viết code trên để xử lý một exception đơn, bạn có thể có một biến theo sau tên của exception trong lệnh except. Nếu bạn đang khai báo nhiều exception thì bạn có một biến theo sau tuple của các exception đó.

Ví dụ

Nếu bạn không có quyền mở file trong chế độ ghi, thì code trên sẽ cho kết quả:

try:
    some statements here
except:
    exception handling

7

Error: Khong tim thay file

Ví dụ trên có thể được viết rõ ràng hơn như sau:

try:
    some statements here
except:
    exception handling

8

Khi một exception được ném trong khối try, thì trình thực thi ngay lập tức truyền tới khối finally. Sau đó tất cả các lệnh trong khối finally được thực thi, exception được tạo lại lần nữa và được xử lý bởi lệnh except nếu có mặt trong lớp trên tiếp theo của lệnh try-except.

Ví dụ

try:
    some statements here
except:
    exception handling

9

Nếu bạn không có quyền mở file trong chế độ ghi, thì code trên sẽ cho kết quả:

Error: Khong tim thay file

try:
    print 1/0

except ZeroDivisionError:
    print "You can't divide by zero, you're silly."

0

Ví dụ trên có thể được viết rõ ràng hơn như sau:

Khi một exception được ném trong khối try, thì trình thực thi ngay lập tức truyền tới khối finally. Sau đó tất cả các lệnh trong khối finally được thực thi, exception được tạo lại lần nữa và được xử lý bởi lệnh except nếu có mặt trong lớp trên tiếp theo của lệnh try-except.

Tham số của một Exception trong Python

try:
    print 1/0

except ZeroDivisionError:
    print "You can't divide by zero, you're silly."

1

Một Exception có thể có một tham số, mà là một giá trị mà cung cấp thông tin bổ sung về vấn đề. Nội dung của tham số là đa dạng tùy vào các exception. Dưới đây là cú pháp:

try:
    print 1/0

except ZeroDivisionError:
    print "You can't divide by zero, you're silly."

2