Assert 通常用于测试代码以确保某些东西有效:
def test_bool():
assert True != False
其中 try, raise 和 except 异常处理是 python 中处理和传播错误的首选方式。
如果出现问题,大多数库和 python 内置函数都会引发一种或另一种类型的异常。通常在您自己的代码中,当您检测到出现问题时,您还希望引发异常。假设您正在编写一个电子邮件地址验证器,并且如果地址不包含 @ 符号,您想引发异常。你可以有类似的东西(这是玩具代码,实际上不要验证这样的电子邮件):
def validate_email(address):
if not "@" in address:
raise ValueError("Email Addresses must contain @ sign")
然后在代码中的其他地方,您可以调用 validate_email 函数,如果它失败,将抛出异常。
try:
validate_email("Mynameisjoe.com")
except ValueError as ex:
print("We can do some special invalid input handling here, Like ask the user to retry the input")
finally:
close_my_connection()
print("Finally always runs whether we succeed or not. Good for clean up like shutting things down.")
要知道的重要一点是,当引发异常时,它会向上传递调用堆栈,直到找到处理程序。如果它永远找不到处理程序,那么它将使程序因异常和堆栈跟踪而崩溃。
您不想做的一件事是:
if __name__ == '__main__':
try:
print(1/0)
except Exception as ex:
pass
现在您无法知道为什么您的应用程序崩溃了。
你会经常看到的一件没问题的事情是:
import logging
if __name__ == '__main__':
try:
print(1/0)
except Exception as ex:
logging.exception(ex)
raise
在这种情况下,由于没有参数,所以 raise 会重新引发相同的错误。通常在 Web 代码中,您会看到类似的东西不会重新引发异常,因为它会将 500 错误发送到客户端,然后继续下一个请求,因此在这种情况下,您不希望程序结束。