目录
异常
异常,也就是bug。出现异常也就是程序运行的过程中出现了错误。
异常的捕获
提前假设某处出现异常,做好以前准备。当真的出现异常的时候,可以有后续手段。
捕获常规异常(全部异常)
try:
可能发生错误的代码
except:
如果出现异常执行的代码
例如:
try:
print(1/0)
except:
print(f"出现异常了!")
运行结果:
捕获指定异常
try:
......
except 具体异常 [as 别名]:
......
注:如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
例如:我们并未定义变量却直接打印,我们便可以指定捕获变量名称的异常
try:
print(num)
except NameError as e:
print(f"出现异常了,{e}")
运行结果:
捕获多个异常
把需要捕获的异常类型的名字以数组的方式放在except之后。
try:
......
except (异常1,异常2,......):
......
例如,我们要捕获除数为0与变量名的异常:
try:
print(1/0)
except (NameError,ZeroDivisionError):
print("出现异常了!可能是变量名或者除数为0的错误哦!")
运行结果:
捕获全部异常
try:
......
except Exception:
......
异常的else
else表示如果没有异常需要执行的代码
try:
可能出现异常的代码
except:
出现异常时执行的代码
else:
无异常时执行的代码
例如:
try:
a = 4/2
except ZeroDivisionError:
print("出现异常了哦!除数不能为0!!!")
else:
print(f"4/2的结果是{a}")
运行结果:
异常的finally
finally后为无论如何都要执行的代码
例如:
此时有文件D:/PythonFileTst/demo1.txt,其内容为:
有代码:
try:
f = open("D:/PythonFileTst/demo1.txt",'r',encoding="UTF-8")
except:
f = open("D:/PythonFileTst/demo1.txt",'w',encoding="UTF-8")
else:
print("没有异常!")
finally:
f.close()
如果有这个文件,我们进行只读模式。并打印“没有异常!”
如果没有这个文件(出现异常),我们用'w'mode进行创建并写入。
无论以何种方式处理文件,最后都close文件。
运行结果:
异常的传递性
异常是具有传递性的,所以当我们处理异常时,没有必要去异常出现的最根部处理或者捕获。
例如:
def fun1():
a = 1/0
def fun2():
fun1()
def main():
try:
fun2()
except:
print("出现异常了!")
main()
此代码中,在fun1中,出现了除数为0的异常。
异常从fun1传递到fun2,最后传递到main中被我们捕获到。
运行结果:
结论
代码中出现bug是常有的事,我们不能害怕出错,而是学习如何解决问题和积累经验。同时,利用积累的知识,在编写代码时提前预想到可能出现的bug,将其捕获并规避掉,才是我们需要做到的。