Python使用称为异常(exception)的特殊对象来管理程序运行期间发生的错误。每当发生错误时,它都会创建一个异常对象(比如FileNotFoundError);如果用户编写了处理该异常的代码,即使出现异常,程序也将继续运行,显示用户自己编写的错误提示信息,而不是traceback;如果用户未对异常进行处理,程序将停止,并显示一个traceback,其中包含异常有关的报告。
处理异常
1)try_except...
如果在执行 try 子句时没有异常发生,则不会执行 except 子句。
如果 try 子句发生了异常,则跳过该子句中剩下的部分,执行 except子句。
如果 except 子句没有指定异常类型,则可以处理 try 中的所有异常类型。
如果 except 子句可以指定多个异常类型(指定多个异常类型时,也可以用元组来表示)。
如果一个异常没有与任何的 except 匹配,则报错。
如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上 层的 try 中。
def div(a, b):
try:
try:
c = a / b
print(f"{a} / {b} = {c}")
except ZeroDivisionError:
print('try中发生了除数为0的异常')
except:
print('发生了除0以外的异常')
div('2', 2)
2)try ... except ... else ...
else 子句必须放在所有的 except 子句之后 ,另外else 子句将在 try 子句没有发生任何异常的时候执行。
def div(a, b):
try:
c = a / b
print(f"{a} / {b} = {c}")
except ZeroDivisionError:
print('try中发生了除数为0的异常')
except:
print('发生了除0以外的异常')
else:
print('try中没有异常')
div(2, 1)
div(2, 0)
div('2', 2)
3)try ... except ... as ...
as 后面为异常实例对象的名称
def div(a, b):
try:
c = a / b
print(f"{a} / {b} = {c}")
# e:ZeroDivisionError('division by zero')
except ZeroDivisionError as e:
print(isinstance(e, ZeroDivisionError))
print(e)
print(ZeroDivisionError('division by zero'))
div(2, 0)
4)... finally ...
finally 子句将作为上述异常处理语句结束前的最后一项任务被执行;不论 try 语句是否产生了异常都会被执行。
def div(a, b):
try:
exit() #当放在try外的话,finally就不会再执行了
c = a / b
print(f"{a} / {b} = {c}")
except:
print('except在发生异常时执行')
else:
print('else在没有异常时执行')
finally:
print('finally在任何情况下都会被执行')
div(2, 1)
div(2, 0)
如果 finally 子句中包含一个 return 语句,则返回值将来自 finally 子 句中的 return 语句的返回值,而非来自 try 子句中的 return 语句的返 回值。
def return_num():
try:
return 1
finally:
return 2
print(return_num())
抛出异常
raise 语句可以主动的抛出异常。
raise 后面可以是 异常实例 / 异常类 / 没有内容。
def div(a, b):
if b == 0:
raise ZeroDivisionError('除数为0') # 抛出异常实例对象
c = a / b
print(f"{a} / {b} = {c}")
div(2, 1)
div(2, 0)
自定义异常
# class MyError:
# def __init__(self, message=''):
# self.message = message
#
# def __str__(self): # 与__repr__等效
# return str(self.message)
#
#
# print(MyError("发生了一个异常"))
#自定义的异常类通常需要直接或间接的继承 Exception 类,
#该Excetpion已经实现了__str__。
class MyError2(Exception):
pass
print(MyError2("发生了一个异常"))
assert断言
assert 用于判断一个表达式,在表达式为 False 的时候触发 AssertionError 异常,为True的话继续向下执行。
assert expression 等价于 if not expression: raise AssertionError
assert expression [, arguments] 等价于:if not expression: raise AssertionError(arguments)
num = int(input("请输入一个整数: "))
assert num != 1, "用户不能输入1" # assert expression [, arguments]
print("断言条件为True, 用户没有输入1")
.