输入与预期不匹配,触发异常,程序退出:

一、异常处理:使用try、except进行错误处理

为了保证程序运行的稳定性,错误应该被程序捕捉并合理控制

  • Python使用保留字try和except进行异常处理。
  • 语句块1是正常执行的程序内容,当执行这个语句块发生异常时,即执行except后面的语句块2
try:n = eval(input("请输入一个数字:"))print("输入数字的3次方值为:", n ** 3)
except:print("输入错误,请输入一个数字!")
请输入一个数字:abc
输入错误,请输入一个数字!

二、异常处理:使用try、except处理程序运行错误

以下语句发生除零的情况,程序报错:

捕捉错误:

try:for i in range(4):print(10 / i, end="")
except:print("某种原因,出错了!")
某种原因,出错了!

三、异常处理:使用try、except处理特定的错误类型

在except后指明错误类型,大小写敏感。

try:for i in range(5):print(10/i, end="")
except ZeroDivisionError:print("除数为零,产生了除零错误!")
except:print("某种原因,出错了!")

编写程序中,建议在输入合规性判断、保证关键代码可靠性等方面广泛使用异常处理机制。

四、捕获多个异常类型

当捕获多个异常时,可以把要捕获的异常类型的名字,放到except 后,并使⽤元组的⽅式进⾏书写。

try:print(1/0)  # 如果没有异常,执行的语句
except (NameError, ZeroDivisionError):  # 可能的异常类型print("there is an error.")  # 如果出现异常,执行的语句

五、捕获异常描述信息

print(1/0)

输出:

捕获异常信息:except 异常类型 as 变量名:,然后打印变量名

try:print(1/0)
except (NameError, ZeroDivisionError) as result:print(result)

输出:

六、捕获所有异常

**Exception是所有程序异常类的⽗类。**不需要书写具体的异常类型了。

  • Exception大小写敏感
try:print(1/0)
except Exception as result:print(result)

输出:

七、try、except高级用法

  1. 执行逻辑:Python先执行语句块1,如果语句块1不发生异常则奖励性地执行else语句块3;如果发生了异常则执行except语句块2;无论是否发生异常,最后都要执行finally语句块4.
  2. 一个这样写的理由是:如果finally里有一个语句可能会发生异常,你可以把这个可能的异常放在外层,在外层来处理掉它,让finally语句顺利final。用来测试程序是不是考虑周全可以final了。
  3. 反对这种写法的一个理由是:在很多情况下,异常处理器需要做一些扫尾工作。
  4. 一个最终的注意点:如果 finally 中的代码引发了另一个异常或由于 return,break,continue 语法而终止,原来的异常将丢失而且无法重新触发。
try:print(1)
except Exception as result:print(result)
else:print("我是else,是没有异常的时候执⾏的代码")输出:
1
我是else,是没有异常的时候执⾏的代码
try:f = open("test.txt", "r")
except Exception as result:f = open("test.txt", "w")
else:print("真开心,没有异常")
finally:f.close()

八、异常的传递

执行py文件的方式:

  • pycharm右键run
  • pycharm - Python console
  • 在py文件所在目录,删除路径,输入cmd,回车,即可进入当前目录的命令行工具。
  • 命令行自动补全功能,TAB键

.

需求:

  1. 尝试只读⽅式打开test.txt⽂件,如果⽂件存在则读取⽂件内容,⽂件不存在则提示⽤户即可。
  2. 读取内容要求:尝试循环读取内容,读取过程中如果检测到⽤户意外终⽌程序,则 except 捕获异常
    并提示⽤户。
import time
try:f = open("test.txt")try:while True:content = f.readline()if len(content) == 0:breaktime.sleep(2)print(content, end="")except:# 如果在读取⽂件的过程中,产⽣了异常,那么就会捕获到# ⽐如 按下了 ctrl+cprint('意外终⽌了读取数据')finally:f.close()print("\n关闭文件")
except:print("没有这个文件")

结论:
- try、except可以嵌套使用
- 异常从里层向外层传递

.

九、raise抛出自定义异常

在Python中,抛出自定义异常的语法为 raise 异常类对象
作用:

  • 可用于报错(该错可能不是语法的错)
  • 可以把不满足程序逻辑的错误,用自定义异常的方式报给用户

案例需求:密码⻓度不⾜,则报异常(⽤户输⼊密码,如果输⼊的⻓度不⾜3位,则报错,即抛出⾃定义异常,并捕获该异常)。步骤:

  • 自定义异常类
  • 抛出自定义异常
  • 捕获异常
# 1.自定义异常类,继承Exception类
class SelfDefineError(Exception):def __init__(self, length, minlength):self.length = length  # 用户输入的密码长度self.minlength = minlength  # 系统要求的密码长度def __str__(self):   # 设置抛出异常的描述信息return "你输入的密码长度是{},不能少于{}个字符".format(self.length, self.minlength)def main():try:# 2.抛出自定义异常con = input("请输入密码:")if len(con) < 3:raise SelfDefineError(len(con), 3)  # 抛出异常:创建异常类对象,传入实参。相当于raise打印异常# 3.捕获异常except Exception as result:print(result)else:  # 没有异常的时候,给用户一个提示信息print("密码已输入完成")main()输出:
请输入密码:11
你输入的密码长度是2,不能少于3个字符

十、小结



十一、case:猜数字游戏

版本1:

import random
target = random.randint(1, 10)
count = 0
while True:guess = eval(input("请输入一个整数:"))count += 1if guess > target:print("猜大了")elif guess < target:print("猜小了")else:print("猜对了")break
print("此轮的猜测次数是:", count)

如果用户输入非数字,会产生运行错误,接着程序退出。为了增加程序鲁棒性,需要增加异常处理机制。

版本2:

import random
target = random.randint(1, 10)
count = 0
while True:try:guess = eval(input("请输入一个猜测的整数:"))except:print("输入有误,请重试,不计入猜测次数哦")continuecount += 1if guess > target:print("猜大了")elif guess < target:print("猜小了")else:print("猜对了")break
print("此轮的猜测次数是:", count)

十二、二分查找法

  • 数学上有一个经典的搜索算法:二分查找法,即每次都猜(最大值+最小值)/2的那个值,根据反馈的大小情况继续查找,直到找到结果。通过二分查找法,每次获得的搜索范围都比前一次缩小一半。
  • 如,初次为1到N的整数范围,采用二分查找法需要logN(以2为基数)次即可找到结果。当N为1000时,logN的值为10,即最多不超过10次。
import math
a = math.log(1000, 2)
print(a)9.965784284662087

版本2的测试:

请输入一个猜测的整数:500
猜小了
请输入一个猜测的整数:750
猜小了
请输入一个猜测的整数:875
猜大了
请输入一个猜测的整数:812.5
猜大了
请输入一个猜测的整数:781.25
猜小了
请输入一个猜测的整数:796.87
猜大了
请输入一个猜测的整数:789.06
猜小了
请输入一个猜测的整数:793
猜大了
请输入一个猜测的整数:791
猜小了
请输入一个猜测的整数:792
猜对了
此轮的猜测次数是: 10

十三、小结

一个正常运行的case:

def example(x, y):return x[y]
x = "abc"
print(example(x, 2))输出:
c

修改后,运行报错退出运行:

Traceback (most recent call last):File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 4, in <module>print(example(x, 4))File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 2, in examplereturn x[y]
IndexError: string index out of range

第一: try不仅捕获异常,而且会恢复执行

def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except:print("got exception")print("程序出错,请修改")test()输出:
got exception
程序出错,请修改

第二:无论try是否发生异常,finally是无论是否捕捉到异常都会被执行,finally 可以单独和try搭配,也可以和except,包括else一起配合使用。

def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except:print("got exception")finally:print("这是finally语句块")print("程序出错,请修改")test()输出:
got exception
这是finally语句块
程序出错,请修改

第三:try无异常,才会执行else

def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except:print("got exception")else:print("这是else语句块")finally:print("这是finally语句块")print("程序出错,请修改")test() #程序异常,不会执行else语句块输出:
got exception
这是finally语句块
程序出错,请修改
def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 2))except:print("got exception")else:print("这是else语句块")finally:print("这是finally语句块")print("程序出错,请修改")test() #程序正常,输出else语句块输出:
c
这是else语句块
这是finally语句块
程序出错,请修改

else作用:没有else语句,当执行完try语句后,无法知道是没有发生异常,还是发生了异常并被处理过了。通过else可以清楚的区分开。

第四:利用raise传递异常

  • raise语句不包括异常名称或额外资料时,会重新引发当前异常。如果希望捕获处理异常,又不希望异常在程序代码中消失,可以通过raise重新引发该异常。
def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except:print("got exception")raiseelse:print("这是else语句块")finally:print("这是finally语句块")print("程序出错,请修改")test()输出:
Traceback (most recent call last):File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 17, in <module>test()File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 7, in testprint(example(x, 4))File "C:/Users/520/PycharmProjects/pythonProject1/exercise.py", line 2, in examplereturn x[y]
IndexError: string index out of range   #正常执行语句同时可以捕获异常
got exception
这是finally语句块

十四:指定异常具体类型except(name1, name2)

  • 如果except后无任何参数,则捕获所有异常;except后有参数,捕获参数列出的异常。
def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except IndexError:  #指定只有IndexError才会执行except语句print("got exception")else:print("这是else语句块")finally:print("这是finally语句块")print("程序出错,请修改")test()输出:
got exception
这是finally语句块
程序出错,请修改
def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except (TypeError, IndexError):  #指定两个异常类型print("got exception")else:print("这是else语句块")finally:print("这是finally语句块")print("程序出错,请修改")test()输出:
got exception
这是finally语句块
程序出错,请修改


第六、注意:不建议在finally语句块中使用return语句

def example(x, y):return x[y]x = "abc"
def test():try:print(example(x, 4))except :print("got exception")print(1 / 0)  #因为finally里的return,except里的这个异常不会打印出来finally:print("这是finally语句块")return 10print("程序出错,请修改")  #因为finally里的return,这个print不会打印出来test()输出:
got exception
这是finally语句块
  • 当finally中有return时,try/except虽然有异常但是并没有抛出,这是因为在try/except/else/finally逻辑中,finally执行逻辑比try/except异常抛出执行的逻辑要优先,注意是finally执行逻辑比try/except中异常抛出的优先级要高,而不是try/except中非异常代码逻辑的优先级
  • 这也可以从官方文档得到体现:
    A finally clause is always executed before leaving the try statement, whether an exception has occurred or not. When an exception has occurred in the try clause and has not been handled by an except clause (or it has occurred in a except or else clause), it is re-raised after the finally clause has been executed. The finally clause is also executed “on the way out” when any other clause of the try statement is left via a break, continue or return statement.
    大致意思就是:就是说except、else子句中的异常在finally子句执行之后才会抛出,但是finally直接return了,所以我们就看不到异常了,而且会覆盖本身的return值。这种用法显然是不符合初衷的,所以不建议在finally语句中使用return、break、continue这些跳出的语句,应仅用作资源释放操作,否则会出现意想不到的结果。

PS: for reference, python123.io, itheima

Python程序异常处理:try、except、else、finally,捕获指定异常类型、捕获多个异常类型、捕获所有异常类型、捕获异常信息、异常的传递、raise抛出自定义异常相关推荐

  1. python异常(概念、捕获、传递、抛出)

    python异常(概念.捕获.传递.抛出) 参考文章: (1)python异常(概念.捕获.传递.抛出) (2)https://www.cnblogs.com/xiangribai/p/8594392 ...

  2. python程序异常处理输入整数_python_异常处理

    1.1.异常的概念 程序在运行时,如果python解释器遇到一个错误,会停止程序的运行,并且提示一些错误信息,这就是异常 程序停止执行并且提示错误信息后这个动作,我们通常称之为:抛出异常 程序开发时, ...

  3. python程序异常处理_python中程序的异常处理

    什么叫异常? 导致程序异常退出叫做异常 try...except...else 如果要抓取某种特定异常可以用except ERROR as e else:如果程序正常执行那么会执行else里面的代码 ...

  4. 设计自己的异常类表示对负数求平方根的错误;从键盘输入一个数,若输入的数不小于0,则输出它的平方根;若小于0,则抛出自定义异常;在程序中处理异常并输出提示信息“输入错误,不能对负数求平方根”

    import java.util.Scanner;public class squareRoot {public static void main(String[] args) {Scanner sc ...

  5. Python程序运行中出现异常错误的捕获语法——try、except和finally

    文章目录 01. 异常的概念 02. 捕获异常 2.1 简单的捕获异常语法 简单异常捕获演练 -- 要求用户输入整数 2.2 错误类型捕获 异常类型捕获演练 -- 要求用户输入整数 捕获未知错误 2. ...

  6. python的异常处理

    python的try语句有两种风格 一:种是处理异常(try/except/else) 二:种是无论是否发生异常都将执行最后的代码(try/finally) try/except/else风格 try ...

  7. 深入Python3阅读day01——从一个Python程序开始

    从一个Python程序开始 一.分析书的目录 二.大致看一下前三章开头的话 三.编写02章的新手入门程序 四.声明函数 五.可选参数和命名参数 六.编写易读的代码 七.IMPORT的搜索路径 七.一切 ...

  8. 福州python招聘_【Python程序员招聘|Python程序员最新招聘信息】-看准网

    立即投递 职位薪资:6000-10000 经验:不限 学历:不限 类型:全职 linux下python编程 对接ai平台做应用 立即投递 职位薪资:8000-13000 经验:不限 学历:本科 类型: ...

  9. oracle异常抛出,ORACLE 存储过程异常捕获并抛出

    for tab_name in tables loop execute immediate 'drop table '||tab_name; --此处可能会报错 end loop; 当前情况是,循环表 ...

最新文章

  1. Linux那些事儿 之 戏说USB(20)设备的生命线(三)
  2. postgresql scws zhparser安装
  3. ActiveMQ消息存储持久化
  4. python pdf处理 图片_python PDF文件合并、图片处理
  5. 【深度】北大王奕森:对抗机器学习的鲁棒、隐私和架构
  6. nginx_rtmp中解析sps和pps
  7. 孩子大了真是不好管了
  8. 用机器指令和汇编指令编程(修改版)
  9. 深入理解深度学习中的激活函数
  10. redis 备份导出rdb_Redis持久化知识点—RDB+AOF ,你了解多少
  11. layer.prompt添加多个输入框
  12. HTML 实现扫雷游戏
  13. ArcMap进行标记符号制作
  14. 学习日志day44(2021-09-08)(1、Ajax跨域操作 2、Ajax接收json数据 3、JQuery和Ajax 4、使用JavaScript模板简化操作)
  15. 王菲微博“逗贫”语录暴光
  16. oracle查询数字类溢出,有趣的数值溢出(一)
  17. easyPR车牌识别分析与测试结果
  18. win xp使用技巧
  19. 2018noip模拟 烷基
  20. dnn解读_论文学习+解读1--受优化算法启发的DNN网络设计

热门文章

  1. Django 的系统时区设置 RPC
  2. marquee标签、插入百度地图
  3. mac下java环境变量配置
  4. 关于SRAM,DRAM,SDRAM,以及NORFLASH,NANDFLASH
  5. 纹理窗口Qt+OpenGL之纹理贴图
  6. windows server 2008 r2 jar包后台启动_Sharing-Proxy部署amp;启动(4.0.0-RC3)
  7. php 点击下拉显示内容,php+ajax实现仿百度查询下拉内容功能示例
  8. 无线鼠标可以强制配对_酷冷至尊MM831三模游戏鼠标评测
  9. grub引导项修复详解_修复grub2双系统引导及顺序
  10. java 一个线程运行_Java并发(基础知识)—— 创建、运行以及停止一个线程