1.第一个异常(除以0异常),当输入0的时候,系统提示第四行引发异常报错
#第一个异常处理,除以0异常
i=input("请输入第一个数字:")
n=1000
result=n/int(i)
print("{}除以{}等于{}".format(n,i,result))
为何会出现ZeroDivisionError: division by zero?Tractback提示信息代表什么?,Tractback信息是指"异常堆栈信息",描述了程序运行的过程以及引发异常的信息,上述便出现了引发异常的信息,在第四行引发异常 发生异常的表达式为 result=n/int(i) ,异常信息的描述是ZeroDivisionError: division by zero ,一般来说异常类命名的主要后缀有Exception ,Error,Warning 如何捕获这些异常了?对于上述的例子,我们不能防止用户输入0,但我们在出现异常的时候可以捕获这些异常,并对这些异常进行处理,让程序继续运行下去,而不是终止程序退出。
1.1异常的捕获
如何捕获异常呢?需要借助try-except语句实现,基本的语法如下:在try代码块中,包含可能会引发异常的语句,如果没有引发异常,那么程序便跳到except代码块执行,这就是异常的捕获,大白话就是,在try代码块中放入可能出现异常的语句,在except代码块中处理这个异常
1.2语法格式:
try:
<可能引发异常的语句>
except[异常的类型]:
<异常的处理>
需要注意的是,异常的类型可以省略不写
1.3try-except执行流程如下:
1.4示例代码修改:
#异常捕获
i=input("请输入一个数字:")
n=1000
try:
result=n/int(i)
print(result)
print("{}/{}={}".format(n,i,result))
except ZeroDivisionError as e:#指定ZeroDivisionError异常类型
""" 捕获除数为0的异常 """
print("除数不能为0,发生异常:{}".format(e))#e为异常对象,是一个变量
1.5多个except代码块:
多条语句可能会引发多种不同的异常,对每一种异常都会采用不同的处理方式。针对这种情况,我们可以在一个try后面跟多个except代码块,语法如下:
最后一个except代码块是默认的except代码块,只能放到最后,捕获上面没有匹配的异常类,多个的except代码块根据异常类型匹配到不同的except代码块
示例代码如下:
键盘输入字母g,引发异常,打印异常信息,当然你也可以输入0,引发异常
#一个try后面跟着多个except代码块
i=input("请输入一个数字:")
n=1000
try:
result=n/int(i)#可能引发除数为零的异常,和引发类型转换的异常,放try代码块中
print(result)
print("{}/{}={}".format(n,i,result))
except ZeroDivisionError as e:
print("除数不能为零,发生异常:{}".format(e))
except ValueError as e:
print("输入的不是数字,发生异常:{}".format(e))
1.6多重异常捕获
假若多个的except代码块的异常处理过程类似,便可以合并处理,这便是多重异常捕获,因为多个打except代码块,会增加代码量,示例代码如下:
![](https://i-blog.csdnimg.cn/blog_migrate/2255ec48a92867d00f58c96a8499befc.png)
#多重异常捕获实例:
i=input("请输入一个数字:")
n=1000
try:
result=n/int(i)
print(result)
print("{}/{}={}".format(n,i,result))
except(ZeroDivisionError,ValueError) as e:
print("发生异常:{}".format(e))
1.7try-except语句嵌套
#try-except语句嵌套
i=input("请输入一个数字:")
n=1000
try:
i1=int(i)
try:
result_2=n/i1
print("{}/{}={}".format(n,i1,result_2))
except ZeroDivisionError as e:
print("除数不能为0,发生异常:{}".format(e))
except ValueError as e:
print("输入的不是数,发生异常:{}".format(e))
当输入0的时候,捕获异常,当然你也可以输入一些字符串,捕获到类型异常
分析 :假如我们在键盘上输入0,程序进入第一个try代码块,对于i1=int(i),不会引发异常,继续正常执行try代码块的第二条语句,接着进入到第二个try代码块,执行里面的语句,引发异常,跳转到对应的except代码块执行,执行完 ,程序结束
分析:假如我们在键盘上输入"ahdd",程序进入到第一个try代码块,执行i1=int(i),引发类型转换异常,程序跳转到对应的except代码块执行,执行完后 程序运行结束
2:使用finally代码块释放资源
有时在try-except语句中会占用一些资源,例如打开的文件、网络连接、打开的数据库及数据结果集等都会占用计算机资源,需要程序员释放这些资源。为了确保这些资源能够被释放,可以使用finally代码块,在try-except语句后面还可以跟一个finally代码块,语法如下
注意:无论是try代码块正常结束还是except代码块异常结束,都会执行finally代码块。
代码如下:
#使用finally释放资源
i=input("请输入一个数字:")
n=1000
try:
result=n/int(i)
print("{}/{}={}".format(n,i,result))
except ZeroDivisionError as e:
print("除数不能为0!,发生异常:{}".format(e))
except ValueError as e:
print("输入的不是数字!,发生异常:{}".format(e))
finally:
print("释放资源")
不管try代码块里面是否异常,有异常执行到except代码块,结束 最后接着运行finally语句,如果没有异常正常执行不会执行except代码块,运行完 最后同样执行finally语句
3自定义异常类:
当然你也可以自己编写你的异常类,提高代码的复用性,实现异常类需要继承Exception类或者继承Exception的子类,对于上述的例子的两个异常类 ZeroDivisionErro, ValueErro都是Exception的子类
3.1实现自定义异常类:
encoding="utf-8"
#自定义异常类MyException
class MyException(Exception):
""" 自定义异常类 """
def __init__(self, message): # 定义MyExceptio类构造函数,接收参数message,表示异常描述信息
super().__init__(message)# 调用父类Exception的构造函数,传入参数message
i=input("请输入一个数字:")
n=1000
try:
result=n/int(i)
print(result)
print("{}/{}={}".format(n,i,result))
except ZeroDivisionError:
#print("除数不能为0!,发生异常:{}".format(ZeroDivisionError))
raise MyException("除数不能为0!")
except ValueError:
#print("输入的不是数字,发生异常:{}".format(ValueError))
raise MyException("输入的不是数字!")
其中raise是抛出异常的关键字,后面跟着异常对象,表示抛出指定的异常
4.简单的练一练
4.1 请列举一些常见的异常。
4.2 手动引发异常的语句有哪些?()
A.throw
B.raise
C.try
D.except
4.3 判断对错:(请在括号内打√或×,√表示正确,×表示错误)。
1)每个try代码块都可以伴随一个或多个except代码块,用于处理try代码块中所有可能引发的异常。()
2)为了确保这些资源被释放,可以使用finally代码块。()
3)实现自定义异常类时,需要继承Exception类或其子类。()
4)为了提供程序的健壮性,我们应该对所有类型异常都进行捕获。()
5)一个整数除以0时会引发ValueError异常。()
5总结:
异常处理会提高代码的健壮性,学了异常的捕获和finally代码块,和自定义异常类,以及引发异常手动的,在进行异常捕获的时候,使用try-except语句实现,在except语句中,可以明确的指定异常类型,使得可以精准的捕获异常 在一个try代码块中,可以跟着许多的except代码块,但最后一个代码块要省略异常的类型。try-except语句还可以嵌套try-except语句,但会显得程序复杂,不是太建议。推荐一个可以实现程序执行过程的网站:https://pythontutor.com/render.html#mode=edit
一个数据结构算法可视化的网址,可以选择自己喜欢的语言运行,进行学习
序 - Hello 算法动画图解、一键运行的数据结构与算法教程https://www.hello-algo.com/chapter_hello_algo/