Python程序的异常处理
异常的出现
import math n=input("Enter:") n=float(n) print(math.sqrt(n)) print("done")
执行程序,如果输入的数不是一个有效的整数,例如输入12a,就出现错误:
Enter:12a Traceback (most recent call last): File "C:/untitled/mmm.py", line 3, in <module> n=float(n) ValueError: could not convert string to float: '12a'
这个问题怎样解决呢 ?
加上异常处理语句。
import math n=input("Enter:") try: n=float(n) print(math.sqrt(n)) print("done") except Exception as err: print(err) print("End")
重新执行该程序,输入12a,则看到如下的结果:
Enter:12a could not convert string to float: '12a' End
异常处理语句
Python使用try-except语句实现异常处理,其基本语法格式如下“
try: <语句块1> except <异常类型>: <语句块2>
异常的类型
python中常见的异常类型
- ZeroDivisionError 除(或取模)零(所有数据类型)
- IndexError #序列中没有此索引
- KeyError #映射中没有这个键
- NameError #未声明/初始化对象(没有属性)
- SyntaxError #Python 语法错误
- ValueError #传入无效的参数
原文链接:https://blog.csdn.net/weixin_53466908/article/details/122787007
#数字运算异常 print(10/0) #ZeroDivisionError 除数不能为0,所以运算异常 #索引异常(使用的索引没有元素) lst=[11,22,33,44] print(lst[4]) #IndexError 索引从0开始,lst列表最大的索引就是3 #键异常(字典里没有这个键) dic={"name":"张三","age":20} print(dic["gender"]) #keyError 字典里没有这个键 #变量异常(未命名该变量) print(num) #NameError num变量未命名 #语法错误 int a=20 #SyntaxError python语法错 #传入无效参数 a=int("hello") #ValueError int()里只能放入整数,不能放入字符串
原文链接:https://blog.csdn.net/weixin_53466908/article/details/122787007
输入异常
观察下面这段小程序
<nowiki>>>> num = eval(input("请输入一个整数: ")) 请输入一个整数: 100
如果用户输入的不是数字呢?
>>> num = eval(input("请输入一个整数: ")) 请输入一个整数: NO Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> num = eval(input("请输入一个整数: ")) File "<string>", line 1, in <module> NameError: name 'NO' is not defined >>>
由于使用了eval()函数,如果用户输入不是一个数字,则可能报错。这类由于输入与预期不匹配而造成的错误有很多种可能,不能逐一列出可能性进行判断。为了保证程序运行的稳定性,这类运行错误应该被程序捕获,并合理控制。
- 为上面的小程序增加异常处理,程序如下。
try: num = eval(input("请输入一个整数: ")) print(num**2) except Exception as err: print(err)
这时如果程序遇到因为用户输入而导致的错误,那么他就不会因此造成程序崩溃,而是及时被程序所捕获,并合理控制。
运行异常
除了输入之外,异常处理还可以处理程序执行中的运行异常。
运行下列代码,会出现:
for i in range(5): print(10/i, end=" ")
会出现如下报错:
Traceback (most recent call last): File "D:\teaching\自动化运维\练习\4-1.py", line 3, in <module> print(10/i, end=" ") ZeroDivisionError: division by zero
增添异常处理机制:
try: for i in range(5): print(10/i, end=" ") except Exception as err: print(err)
现在的运行结果:异常被成功捕获。
>>>division by zero
抛出异常
异常是程序运行时的一种错误,那么这个异常是如何抛出的呢?在Python中抛出异常的语句是raise语句。格式如下:
raise Exception(异常信息)
其中raise为抛出语句, Exception(异常信息)表示建立一个异常类Exception的对象,该对象用指定的字符串设置其Message属性。
例:
print("start") try: print("In try") raise Exception("My error") print("finish") except Exception as err: print(err) print("end")
例:应用异常处理,输入一个整数,计算它的平方根
import math while True: try: n=input("Enter: ") n=int(n) if n<0: raise Exception("整数为负数") break except Exception as err: print("输入错误: ",err) print(math.sqrt(n)) print("done")
案例
1、案例描述 输入学生的姓名Name、性别Gender、年龄Age,要求Name非空、Gender为"男"或者"女"、Age在18-30之间。 2、案例分析 构造一个异常语句结构,输入学生的Name、Gender、Age,如果有错误就抛出异常。
拓展
除了最基本的try-except语句,Python异常,还有一些略为高级的用法,这些方法在实际程序设计中也十分有用。
比方说,try-except语句可以支持多个excpet语句,语法格式如下。
try: <语句块1> except <异常类型1>: <语句块2> ... except <异常类型N>: <语句块N+1> except: <语句块N+2>
其中,第一个到第n个except语句后面都指定了异常类型,说明这些except所包含的语句块只处理这些类型的一种,其中最后一个except语句没有指定任何类型,表示他,对应的语句块,可以处理其他所有异常。
try: alp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" idx = eval(input("请输入一个整数: ")) print(alp[idx]) except NameError: print("输入错误,请输入一个整数!") except: print("其他错误")
除了try和except语句外,异常语句还可以与else、finally保留字配合使用。
try: alp = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" idx = eval(input("请输入一个整数: ")) print(alp[idx]) except NameError: print("输入错误,请输入一个整数!") else: print("没有发生异常") finally: print("程序执行完毕,不知道是否发生了异常")
实例: Python 3.8实现支持断点续传的网络文件下载功能
练习
练习(二级真题):Python异常处理中不会用到的关键字是
A.if
B.try
C.finally
D.else