为什么会出现异常:
1) 程序出错了,1/0、变量没定义等
2) 用户输入的数据问题
def add(a,b):
return a+b
a=input("a:") #输入hello
b=input("b:") #输入100
print(add(a,int(b))) #str类型和int类型相加的异常
3) 运行中,性能的问题。内存泄漏、句柄泄露。
异常:
当异常出现的时候,且没有做任何处理,程序不会继续执行,也就是程序被中断了。
服务端程序:出现异常没有捕获,程序就中断了
捕获异常是为了让程序出现异常的时候仍然能继续运行下去而不会中断。
异常捕获的应用场景:
1 可能程序出错的地方
2 异常处理用户可能输入的错误数据
3 异常处理可能出现的系统(io)的错误
4 异常处理可能出现的网络的错误
异常信息有啥用:
出错的代码行号
异常类型:+具体的信息说明
捕获异常的例子:
try:
1/0
except ZeroDivisionError:
print("除0的错误出现了!")
except:
print("有未知错误")
finally:
pass
try不可以单独存在,必须有except,或者finally
except ZeroDivisionError:出现除0的时候,会被这里捕获,执行下面的print(“除0的错误出现了!”)
如果前面具体的异常都没有捕获到,会执行except:下的语句,相当于缺省值,保证所有的异常都能被处理,不会导致程序中断。
finally:无论前面的try-except的执行结果怎样,最终都会执行finally:下的语句,通常finally都是用于释放一些资源。
编译过程错误:语法错误、缩进错误不会被except拦截
养成一个习惯:
1)把异常的信息搞明白什么意思
2)出错的代码在哪一行,具体的代码是啥。具体分析。
except后面没有具体异常的要放最后面,否则会报错
try:
1/0
except:
print("有未知错误")
except ZeroDivisionError:
print("除0的错误出现了!")
try:
1/0
except ZeroDivisionError:
print("除0的错误出现了!")
except:
print("有未知错误")
try-else
没有执行except才执行else
else:在try执行完所有内部的代码后,没有异常的情况下才会被执行。有异常,则不会被执行
try:
1/1
except ZeroDivisionError as f:
print("除0的错误出现了!")
print(f)
print(traceback.print_exc())
except:
print("未知异常!")
else:
print("没有出现错误!")
通常finally都是用于释放一些资源
try:
1/1
except ZeroDivisionError as f:
print("除0的错误出现了!")
print(f)
print(traceback.print_exc())
except:
print("未知异常!")
else:
print("没有出现错误!")
finally:
print("无论如何我都会被执行!")
import traceback
try:
raise ZeroDivisionError
except ZeroDivisionError as f:
print("除0的错误出现了!")
print(f)
print(traceback.print_exc())
except NameError:
print("NameError异常!")
else:
print("没有出现错误!")
finally:
print("无论如何我都会被执行!")
自定义异常
class Networkerror(RuntimeError):
# 重写默认的__init__()方法,
# 抛出特定的异常信息
def __init__(self, value):
self.value = value
触发自定义的异常
try:
raise Networkerror("Bad hostname")
except Networkerror as e:
print ("My exception occurred, value:", e.value)
断言:期望的结果和实际的结果做比对
try:
assert 1==2
except:
print("断言异常")
断言异常