异常:
异常不是语法错误,异常是一个事件是一个错误,当程序遇到这个异常时,要么去处理它要么终止并退出。如果异常没有处理,Python会调用回溯(traceback一种错误信息)并终止执行。Exception是所有异常的基类,Python利用exception object来表示异常。处理异常是用try: except:语句来包裹可能会出现异常的代码块。
try: # 可疑代码块 # except Exception1: 单个try语句可以抛出多个异常,可以用多个except语句,也可以用一个except语句处理所有异常 # ........ # except Exception2: 如果代码在try:块不产生异常,可以在else语句中执行,else语句不需要try:块的保护,else语句必须在except之后 # ........ # else: # ...........
一个简单的例子:
try: print(1/0) except ZeroDivisionError: print("被除数不能为0!")
结果:
被除数不能为0!
这样就将一个错误处理掉了。
再举一个例子:
try: x = int(input("除数:")) y = int(input("被除数")) print(x/y) except ZeroDivisionError: print("被除数为0") # 捕捉多个异常 except (ValueError,TypeError) as e: print("被除数非整数") print(e) # 在try中可疑代码块无异常时执行 else: print("结果正常运行")
当我们输入的被除数为0、非整数、非int型数据时,会分别抛出不同的异常
finally关键字:
finally关键字总是放在最后,而且不管有没有异常总会被执行。同样也可以放在函数中。
例子:
while True: try: x = int(input("除数:")) y = int(input("被除数")) print(x / y) except Exception as e: print("错误信息为", e) else: print("计算正确") break finally: print("结束!")
无论有没有异常,finally总会被执行
def function1(x,y): try: result=x/y except Exception as e: print(e) else: print(result) finally: print("结束了") # print(function1(1,"x"))
不管参数如何,finally语句总会被执行
异常具有传递性,我们必须在可能发生异常的地方处理掉异常
def faulty(): raise Exception("someting is wrong!") def ignore_exception(): faulty() print(ignore_exception())
比方我们在最开始有一个异常faulty(),没有去处理它,在ignore_exception()它也继续存在,一直到我们调用这个ignore_exception()函数还是存在
Traceback (most recent call last): File "D:/PythonDemo/异常3--finally.py", line 40, in <module> print(ignore_exception()) File "D:/PythonDemo/异常3--finally.py", line 32, in ignore_exception faulty() File "D:/PythonDemo/异常3--finally.py", line 30, in faulty raise Exception("someting is wrong!") Exception: someting is wrong!