Task 3: 异常处理(2天)
异常处理
目录
1.python 标准异常总结
2.python 标准警告总结
3.try_excpt 语句
4.try_except_finally 语句
5.try_except_else 语句
6.raise 语句
正文
本次学习任务真的太好了,很久之前就想整理一下各种报错到底是什么东西引起的
以后可以直接查看字典了
1.python 标准异常总结
1 BaseException:所有异常的 基类 2 Exception:常规异常的 基类 3 StandardError:所有的内建标准异常的基类 4 ArithmeticError:所有数值计算异常的基类 5 FloatingPointError:浮点计算异常 6 OverflowError:数值运算超出最大限制 7 ZeroDivisionError:除数为零 8 AssertionError:断言语句(assert)失败 9 AttributeError:尝试访问未知的对象属性 10 EOFError:没有内建输入,到达EOF标记 11 EnvironmentError:操作系统异常的基类 12 IOError:输入/输出操作失败 13 OSError:操作系统产生的异常(例如打开一个不存在的文件) 14 WindowsError:系统调用失败 15 ImportError:导入模块失败的时候 16 KeyboardInterrupt:用户中断执行 17 LookupError:无效数据查询的基类 18 IndexError:索引超出序列的范围 19 KeyError:字典中查找一个不存在的关键字 20 MemoryError:内存溢出(可通过删除对象释放内存) 21 NameError:尝试访问一个不存在的变量 22 UnboundLocalError:访问未初始化的本地变量 23 ReferenceError:弱引用试图访问已经垃圾回收了的对象 24 RuntimeError:一般的运行时异常 25 NotImplementedError:尚未实现的方法 26 SyntaxError:语法错误导致的异常 27 IndentationError:缩进错误导致的异常 28 TabError:Tab和空格混用 29 SystemError:一般的解释器系统异常 30 TypeError:不同类型间的无效操作 31 ValueError:传入无效的参数 32 UnicodeError:Unicode相关的异常 33 UnicodeDecodeError:Unicode解码时的异常 34 UnicodeEncodeError:Unicode编码错误导致的异常 35 UnicodeTranslateError:Unicode转换错误导致的异常
标黄色的是经常会遇到的报错类型
#这个是由于函数名或者方法或或者属性重名了 list=['a','b'] list('abcd') #TypeError: 'list' object is not callable
2.python 标准警告总结
1 Warning:警告的基类 2 DeprecationWarning:关于被弃用的特征的警告 3 FutureWarning:关于构造将来语义会有改变的警告 4 UserWarning:用户代码生成的警告 5 PendingDeprecationWarning:关于特性将会被废弃的警告 6 RuntimeWarning:可疑的运行时行为(runtime behavior)的警告 7 SyntaxWarning:可疑语法的警告 8 ImportWarning:用于在导入模块过程中触发的警告 9 UnicodeWarning:与Unicode相关的警告 10 BytesWarning:与字节或字节码相关的警告 11 ResourceWarning:与资源使用相关的警告
3.try-except 语句
#格式如下,[]表示该参数可以输入,或者不输入 try: 检测范围 except Exception[as reason]: 出现异常后的处理代码
try 语句按照如下方式工作:
1 首先,执行try子句(在关键字try和关键字except之间的语句) 2 如果没有异常发生,忽略except子句,try子句执行后结束。 3 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的报错类型的名称(Exception)相符,那么对应的except子句将被执行。最后执行try语句之后的代码。 4 如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
#FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt' f = open('test1.txt') #可以起as 别名,也可以不起 try: f = open('test1.txt') print(f.read()) f.close() except OSError as error: print('打开文件出错\n原因是:' + str(error)) #输出: 打开文件出错 原因是:[Errno 2] No such file or directory: 'test1.txt' #FileNotFoundError 替换 OSError try: f = open('test1.txt') print(f.read()) f.close() except FileNotFoundError as error: print('打开文件出错\n原因是:' + str(error)) #输出: 打开文件出错 原因是:[Errno 2] No such file or directory: 'test1.txt' #TypeError 替换OSError,如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中 try: f = open('test1.txt') print(f.read()) f.close() except TypeError as error: print('打开文件出错\n原因是:' + str(error)) #输出:FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt'
一个try
语句可能包含多个except
子句,分别来处理不同的特定的异常。最多只有一个分支会被执行
#直接执行try里面的代码 int("abc") #ValueError: invalid literal for int() with base 10: 'abc' s = 1 + '1' #TypeError: unsupported operand type(s) for +: 'int' and 'str' f = open('test1.txt') #FileNotFoundError: [Errno 2] No such file or directory: 'test1.txt' #一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行 try: int("abc") s = 1 + '1' f = open('test1.txt') print(f.read()) f.close() except OSError as error: print('打开文件出错\n原因是:' + str(error)) except TypeError as error: print('类型出错\n原因是:' + str(error)) except ValueError as error: print('数值出错\n原因是:' + str(error)) #输出: #数值出错 #原因是:invalid literal for int() with base 10: 'abc'
同一语句可以犯了了好几种异常,使用多个except
代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常
#try-except-else语句尝试查询不在dict中的键值对,从而引发了异常。这一异常准确地说应属于KeyError,但由于KeyError是LookupError的子类,
且将LookupError置于KeyError之前,因此程序优先执行该except代码块。所以,使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常 #单独执行 dict1 = {'a': 1, 'b': 2, 'v': 22} x = dict1['y'] #KeyError: 'y' dict1 = {'a': 1, 'b': 2, 'v': 22} try: x = dict1['y'] except LookupError: print('查询错误') except KeyError: print('键错误') else: print(x) # 查询错误
一个 except
子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组
1 s = 1 + '1' #TypeError: unsupported operand type(s) for +: 'int' and 'str' 2 3 # 一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组 4 #也是只输出第一个报错原因 5 try: 6 s = 1 + '1' 7 int("abc") 8 f = open('test.txt') 9 print(f.read()) 10 f.close() 11 except (OSError, TypeError, ValueError) as error: 12 print('出错了!\n原因是:' + str(error)) 13 14 #输出 15 ''' 16 出错了! 17 原因是:unsupported operand type(s) for +: 'int' and 'str' 18 '''
4.try-except-finally 语句
#格式如下: try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 finally: 无论如何都会被执行的代码
不管try
子句里面有没有发生异常,finally
子句都会执行
如果一个异常在try
子句里被抛出,而又没有任何的except
把它截住,那么这个异常会在finally
子句执行后被抛出
#不管有没有try或者except有没有执行,finally后面的语句都会执行 def divide(x, y): try: result = x / y print("result is", result) except ZeroDivisionError: print("division by zero!") finally: print("executing finally clause") divide(2, 1) # result is 2.0 # executing finally clause divide(2, 0) # division by zero! # executing finally clause divide("2", "1") # executing finally clause # TypeError: unsupported operand type(s) for /: 'str' and 'str'
5.try_except_else 语句
如果在try
子句执行时没有发生异常,Python将执行else
语句后的语句
#使用except而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常 try: 检测范围 except: 出现异常后的处理代码 else: 如果没有异常执行这块代码
因此我们使用下面这种方式
try: 检测范围 except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 else: 如果没有异常执行这块代码
#如果try子句执行没有发生异常,则将执行else内的语句,否则不执行 def divide(x, y): try: result = x / y print("result is", result) except ZeroDivisionError: print("division by zero!") else: print("计算成功") divide(2, 1) divide(2, 0)
6.raise 语句
学习任务给出的例子看的不是很明白,我就找了其他的例子
当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常。一旦执行了raise语句,raise后面的语句将不能执行
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象
#抛出一个指定的异常 def division(): num1=int(input('请输入被除数:')) num2=int(input('请输入除数:')) if num2==0: raise ValueError('除数不能为0') result=num1//num2 print(result) if __name__=='__main__': try: division() except ZeroDivisionError: print('输入错误,除数不能为0') except ValueError as e: # 处理ValueError异常 print('输入错误',e) #输出错误原因 finally: print('释放资源并关闭')
练习题
1、猜数字游戏
题目描述:
1 电脑产生一个零到100之间的随机数字,然后让用户来猜,如果用户猜的数字比这个数字大,提示太大,否则提示太小,当用户正好猜中电脑会提示,"恭喜你猜到了这个数是......"。在用户每次猜测之前程序会输出用户是第几次猜测,如果用户输入的根本不是一个数字,程序会告诉用户"输入无效"。 2 (尝试使用try catch异常处理结构对输入情况进行处理) 3 获取随机数采用random模块
如果输入了非数字,就终止程序
import numpy as np import pandas as pd a=np.random.randint(0,100) n=0 try: while 1: b=int(input('第{}次输入:'.format(n+1))) n=n+1 if a==b: print('恭喜你猜到了,这个数是:',b) break elif b>a: print('数字猜大了') else: print('数字猜小了') except ValueError as error: print('输入无效') n=n+1 finally: print(n)
如果输入了非数字,还是继续输入
import random secert = random.randint(1, 100) # 计算机生成一个随机数 n=1 while 1: num = input("第{}次输入: ".format(n)) n=n+1 if num.isdigit(): tmp = int(num) if tmp == secert: print('恭喜你猜到了,这个数是:',num) break elif tmp < secert: print("数字猜小了") else: print("数字猜大了") else: print("输入无效")
官方答案是下面的:
import random guess=random.randint(1,101) i=1 while True: print ("第%d次猜,请输入一个整数数字:"%(i)) try: temp=int(input()) i+=1 except ValueError : print ("输入无效") continue if temp==guess: print ("恭喜你猜对了,就是这个数",guess) break; elif (temp>guess): print ("大了") elif (temp<guess): print ("小了")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人