Hướng Dẫn Xử Lý Ngoại Lệ Trong Python - Openplanning

  • Tất cả tài liệu
  • Java
    • Java Basic
    • Java Collections Framework
    • Java IO
    • Java New IO
    • Java Date Time
    • Servlet/JSP
    • Eclipse Tech
      • SWT
      • RCP
      • RAP
      • Eclipse Plugin Tools
    • XML & HTML
    • Java Opensource
    • Java Application Servers
  • Maven
  • Gradle
  • Servlet/Jsp
  • Thymeleaf
  • Spring
    • Spring Boot
    • Spring Cloud
  • Struts2
  • Hibernate
  • Java Web Service
  • JavaFX
  • SWT
  • Oracle ADF
  • Android
  • iOS
  • Python
  • Swift
  • C#
  • C/C++
  • Ruby
  • Dart
  • Batch
  • Database
    • Oracle
    • MySQL
    • SQL Server
    • PostGres
    • Other Database
  • Oracle APEX
  • Report
  • Client
  • ECMAScript / Javascript
  • TypeScript
  • NodeJS
  • ReactJS
  • Flutter
  • AngularJS
  • HTML
  • CSS
  • Bootstrap
  • OS
    • Ubuntu
    • Solaris
    • Mac OS
  • VPS
  • Git
  • SAP
  • Amazon AWS
  • Khác
    • Chưa phân loại
    • Phần mềm & ứng dụng tiện ích
    • VirtualBox
    • VmWare
Hướng dẫn xử lý ngoại lệ trong Python
  1. Exception là gì?
  2. Sơ đồ phân cấp
  3. Bắt ngoại lệ thông qua try-except
  4. Khối try-except-finally
  5. Ném tiếp ngoại lệ
  6. Gói một Exception trong một Exception khác

1. Exception là gì?

Trước hết chúng ta hãy xem một ví dụ minh họa sau: Trong ví dụ này có một đoạn code lỗi nguyên nhân do phép chia cho 0. Việc chia cho 0 gây ra ngoại lệ: ZeroDivisionErrorhelloExceptionExample.pyprint ("Three") # Phép chia này không vấn đề. value = 10 / 2 print ("Two") # Phép chia này không vấn đề. value = 10 / 1 print ("One") d = 0 # Phép chia này có vấn đề, cho cho 0 # Một lỗi được phát ra tại đây. value = 10 / d # Dòng mã dưới đây sẽ không được thực thi. print ("Let's go!")Kết quả chạy ví dụ: Bạn có thể thấy thông báo lỗi trên màn hình Console, thông báo lỗi rất rõ ràng, xẩy ra ở dòng thứ mấy trên code.Hãy xem luồng đi của chương trình qua hình minh họa dưới đây.
  • Chương trình đã chạy hoàn toàn bình thường từ các bước (1),(2) cho tới (6)
  • Bước thứ (7) xẩy ra vấn đề khi chia cho 0. Chương trình kết thúc.
  • Đoạn mã bước (8) đã không được thực hiện.
Chúng ta sẽ sửa code của ví dụ trên.helloCatchException.pyprint ("Three") value = 10 / 2 print ("Two") value = 10 / 1 print ("One") d = 0 try : # Phép chia này có vấn đề, chia cho 0. # Một lỗi được phát ra tại đây (ZeroDivisionError). value = 10 / d print ("value = ", value) except ZeroDivisionError as e : print ("Error: ", str(e) ) print ("Ignore to continue ...") print ("Let's go!")Và kết quả chạy ví dụ:Three Two One Error division by zero Ignore to coninue ... Let's go!Chúng ta sẽ giải thích bằng hình minh họa dưới đây về luồng đi của chương trình.
  • Các bước (1)-(6) hoàn toàn bình thường.
  • Ngoại lệ xẩy ra tại bước (7), vấn đề chia cho 0.
  • Lập tức nó nhẩy vào thực thi lệnh trong khối except, bước (8) bị bỏ qua.
  • Bước (9), (10) được thực hiện.
  • Bước (11) được thực hiện.

2. Sơ đồ phân cấp

Đây là mô hình sơ đồ phân cấp của các ngoại lệ trong Python.
  • Lớp ở mức cao nhất là BaseException
  • Các lớp con trực tiếp là ExceptionKeyboardInterrupt, ..
Các Exception sẵn có của Python thông thường được bắt nguồn (derived) từ BaseException (Mở rộng từ BaseException). Trong khi đó các exception của người dùng (lập trình viên) nên thừa kế từ lớp Exception hoặc từ các lớp con của nó.

3. Bắt ngoại lệ thông qua try-except

Chúng ta viết một lớp exception thừa kế từ lớp Exception.
Xem thêm:
  • Thừa kế và đa hình trong Python
Hàm checkAge để kiểm tra tuổi, nếu tuổi nhỏ hơn 18 hoặc lớn hơn 40 một ngoại lệ sẽ được ném ra.ageexception.py# Python 3.x class AgeException(Exception): def __init__(self, msg, age ): super().__init__(msg) self.age = age class TooYoungException(AgeException): def __init__(self, msg, age): super().__init__(msg, age) class TooOldException(AgeException): def __init__(self, msg, age): super().__init__(msg, age) # Hàm kiểm tra tuổi, nó có thể ném ra ngoại lệ. def checkAge(age): if (age < 18) : # Nếu tuổi nhỏ hơn 18, một ngoại lệ sẽ bị ném ra. # Hàm sẽ bị kết thúc tại đây. raise TooYoungException("Age " + str(age) + " too young", age) elif (age > 40) : # Nếu tuổi lớn hơn 40, một ngoại lệ sẽ bị ném ra # Hàm sẽ bị kết thúc tại đây. raise TooOldException("Age " + str(age) + " too old", age); # Nếu tuổi nằm trong khoảng 18-40. # Đoạn code này sẽ được thực thi. print ("Age " + str(age) + " OK!");Ví dụ:tryExceptDemo1.pyimport ageexception from ageexception import AgeException from ageexception import TooYoungException from ageexception import TooOldException print ("Start Recruiting ...") age = 11 print ("Check your Age ", age) try : ageexception.checkAge(age) print ("You pass!") except TooYoungException as e : print("You are too young, not pass!") print("Cause message: ", str(e) ) print("Invalid age: ", e.age) except TooOldException as e : print ("You are too old, not pass!") print ("Cause message: ", str(e) ) print("Invalid age: ", e.age)Chạy ví dụ:Start Recruiting ... Check you Age 11 You are too young, not pass! Cause message: Age 11 too young Invalid age: 11Ví dụ dưới đây, chúng ta sẽ gộp bắt các ngoại lệ thông qua ngoại lệ ở cấp cao hơn. Ở cấp cao hơn nó sẽ bắt được ngoại lệ đó và tất cả các ngoại lệ con.tryExceptDemo2.pyimport ageexception from ageexception import AgeException from ageexception import TooYoungException from ageexception import TooOldException print ("Start Recruiting ...") age = 51 print ("Check your Age ", age) try : ageexception.checkAge(age) print ("You pass!") except AgeException as e : print("You are not pass!") print("type(e): ", type(e) ) print("Cause message: ", str(e) ) print("Invalid age: ", e.age)Output:Start Recruiting ... Check you Age 51 You are not pass! type(e): <class 'ageexceptioon.TooOldException'> Cause message: Age 51 too old Invalid age: 51

4. Khối try-except-finally

Trên kia chúng ta đã làm quen với việc bắt ngoại lệ thông qua khối try-except. Việc xử lý ngoại lệ đầy đủ là try-except-finally. Khối finally luôn được thực thi bất kể ngoại lệ có xẩy ra tại khối try hay không.try - except - finallytry : # Làm gì đó tại đây. except Exception1 as e : # Làm gì đó tại đây. except Exception2 as e : # Làm gì đó tại đây. finally : # Khối finally luôn luôn được thực thi. # Làm gì đó tại đây.Ví dụ:tryExceptFinallyDemo.pydef toInteger(text) : try : print ("-- Begin parse text: ", text) # Một ngoại lệ có thể bị ném ra tại đây (ValueError). value = int(text) return value except ValueError as e : # Trường hợp 'text' không là một số. # Khối 'except' sẽ được thực thi. print ("ValueError message: ", str(e)) print ("type(e): ", type(e)) # Trả về 0 nếu xuất hiện lỗi ValueError. return 0 finally : print ("-- End parse text: " + text) text = "001234A2" value = toInteger(text) print ("Value= ", value)Chạy ví dụ:-- Begin parse text: 001234A2 ValueError message: invalid literal for int() with base 10: '001234A2' type(e): <class 'ValueError'> -- End parse text: 001234A2 Value= 0Đây là sơ luồng đi của chương trình. Khối finally luôn được thực thi.Lệnh passNếu bạn không muốn xử lý gì trong khối 'except' hoặc 'finally' bạn có thể sử dụng lệnh 'pass' (pass statement). Lệnh pass không làm bất cứ điều gì, nó giống như một lệnh null.passStatementExample.pyprint ("Three") try : value = 10 / 0; except Exception as e: pass print ("Two") print ("One") print ("Let's go")Output:Three Two One Let's go

5. Ném tiếp ngoại lệ

Trong khi xử lý ngoại lệ bạn có thể bắt ngoại lệ đó và xử lý hoặc có thể ném tiếp (rethrow) nó ra vòng ngoài.reRaiseExceptionDemo1.pydef checkScore(score) : if score < 0 or score > 100: raise Exception("Invalid Score " + str(score) ) def checkPlayer(name, score): try : checkScore(score) except Exception as e : print ("Something invalid with player: ",name, ' >> ', str(e) ) # re throw exception. raise # ------------------------------------------ checkPlayer("Tran", 101)Ví dụ, bắt ngoại lệ và ném tiếp (rethrow) bởi một ngoại lệ khác.reRaiseExceptionDemo2.pydef checkScore(score) : if score < 0 or score > 100: raise Exception("Invalid Score " + str(score) ) def checkPlayer(name, score): try : checkScore(score) except Exception as e : print ("Something invalid with player: ",name, ' >> ', str(e) ) # throw new exception. raise Exception("Something invalid with player: "+ name + " >> "+ str(e)) # ------------------------------------------ checkPlayer("Tran", 101)

6. Gói một Exception trong một Exception khác

Python cho phép bắt ngoại lệ, và ném ra một ngoại lệ mới, ngoại lệ mới có thể lưu trữ thông tin của ngoại lệ ban đầu, mà bạn có thể truy cập thông qua thuộc tính __cause__.Syntaxtry : # Làm gì đó tại đây... except Exception as e : raise OtherException("Message...") from eXem ví dụ đầy đủ:wrapExceptionDemo.py# Python 3.x: # Ngoại lệ giới tính. class GenderException(Exception): def __init__(self, msg): super().__init__(msg) # Ngoại lệ ngôn ngữ. class LanguageException(Exception): def __init__(self, msg): super().__init__(msg) class PersonException(Exception): def __init__(self, msg): super().__init__(msg) # Hàm này có thể ném ra GenderException. def checkGender(gender): if gender != 'Female' : raise GenderException("Accept female only") # Hàm này có thể ném ra LanguageException. def checkLanguage(language): if language != 'English' : raise LanguageException("Accept english language only") def checkPerson(name, gender, language): try : # Có thể ném ra GenderException. checkGender(gender) # Có thể ném ra LanguageException. checkLanguage(language) except Exception as e: # Bắt exception và ném ra ngoại lệ khác. # Ngoại lệ mới có thông tin __cause__ = e. raise PersonException(name + " does not pass") from e # -------------------------------------------------------- try : checkPerson("Nguyen", "Female", "Vietnamese") except PersonException as e: print ("Error message: ", str(e) ) # GenderException hoặc LanguageException cause = e.__cause__ print ('e.__cause__: ', repr(cause)) print ("type(cause): " , type(cause) ) print (" ------------------ ") if type(cause) is GenderException : print ("Gender exception: ", cause) elif type(cause) is LanguageException: print ("Language exception: ", cause)Output:Error message: Nguyen does not pass e.__cause__: LanguageException('Accept english language only',) type(cause): <class '__main__.LanguageException'> ------------------ Language exception: Accept english language only

Các hướng dẫn lập trình Python

  • Tra cứu tài liệu Python
  • Các lệnh rẽ nhánh trong Python
  • Hướng dẫn và ví dụ Python Function
  • Lớp và đối tượng trong Python
  • Thừa kế và đa hình trong Python
  • Hướng dẫn và ví dụ Python Dictionary
  • Hướng dẫn và ví dụ Python Lists
  • Hướng dẫn và ví dụ Python Tuples
  • Hướng dẫn sử dụng Date Time trong Python
  • Kết nối cơ sở dữ liệu MySQL trong Python sử dụng PyMySQL
  • Hướng dẫn xử lý ngoại lệ trong Python
  • Hướng dẫn và ví dụ String trong Python
  • Giới thiệu về Python
  • Cài đặt Python trên Windows
  • Cài đặt Python trên Ubuntu
  • Cài đặt PyDev cho Eclipse
  • Quy ước và các phiên bản ngữ pháp trong Python
  • Hướng dẫn lập trình Python cho người mới bắt đầu
  • Vòng lặp trong Python
Show More

Các hướng dẫn lập trình Python

  • Tra cứu tài liệu Python
  • Các lệnh rẽ nhánh trong Python
  • Hướng dẫn và ví dụ Python Function
  • Lớp và đối tượng trong Python
  • Thừa kế và đa hình trong Python
  • Hướng dẫn và ví dụ Python Dictionary
  • Hướng dẫn và ví dụ Python Lists
  • Hướng dẫn và ví dụ Python Tuples
  • Hướng dẫn sử dụng Date Time trong Python
  • Kết nối cơ sở dữ liệu MySQL trong Python sử dụng PyMySQL
  • Hướng dẫn xử lý ngoại lệ trong Python
  • Hướng dẫn và ví dụ String trong Python
  • Giới thiệu về Python
  • Cài đặt Python trên Windows
  • Cài đặt Python trên Ubuntu
  • Cài đặt PyDev cho Eclipse
  • Quy ước và các phiên bản ngữ pháp trong Python
  • Hướng dẫn lập trình Python cho người mới bắt đầu
  • Vòng lặp trong Python
Show More

Các bài viết mới nhất

  • Xử lý lỗi 404 trong Flutter GetX
  • Ví dụ đăng nhập và đăng xuất với Flutter Getx
  • Hướng dẫn và ví dụ Flutter NumberTextInputFormatter
  • Hướng dẫn và ví dụ Flutter multi_dropdown
  • Hướng dẫn và ví dụ Flutter flutter_form_builder
  • Hướng dẫn và ví dụ Flutter GetX obs Obx
  • Hướng dẫn và ví dụ Flutter GetX GetBuilder
  • Từ khoá part và part of trong Dart
  • Hướng dẫn và ví dụ Flutter InkWell
  • Bài thực hành Flutter SharedPreferences
  • Hướng dẫn và ví dụ Flutter Radio
  • Hướng dẫn và ví dụ Flutter Slider
  • Hướng dẫn và ví dụ Flutter SkeletonLoader
  • Chỉ định cổng cố định cho Flutter Web trên Android Studio
  • Hướng dẫn và ví dụ Flutter SharedPreferences
  • Tạo Module trong Flutter
  • Flutter upload ảnh sử dụng http và ImagePicker
  • Bài thực hành Dart http CRUD
  • Hướng dẫn và ví dụ Flutter image_picker
  • Flutter GridView với SliverGridDelegate tuỳ biến
Show More
  • Các hướng dẫn lập trình Python

Từ khóa » Try Và Except Trong Python