Python程序的异常处理

来自CloudWiki
跳转至: 导航搜索

异常的出现

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>

Python2022112901.png

异常的类型

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