异常
目录
0.了解异常
#程序调试及异常处理
"""
try-except, except 除……之外
就是用一个try except然后它才可以继续执行下面的内容,如果不这样会报错中止程序运行
"""
##-----ZeroDivisionError 除数不为0 ---
def division(x,y):
try:
return x/y
except ZeroDivisionError:
print('除数不可为0')
print(division(2,0))
#----try except else 个人认为用不用else没啥影响,用反而麻烦
def division(x,y):
try:
ans = x/y
except ZeroDivisionError:
print('除数不可为0')
else:
return ans
print(division(2,9))
##-----TypeError 数据类型不符 ---
def division(x,y):
try:
return x/y
except TypeError:
print('TypeError')
print(division('a',0))
#-----------
def division(x,y):
try:
return x/y
except Exception: #Exception一般错误皆可使用
print('Exception')
print(division('a',0))
"""
常见的异常对象:
① AttributeError 对象没有这个属性
②Exception 一般错误皆可使用,通用错误发生
③FileNotFoundError 找不到打开的文档
④IOError 在输入或输出时发生错误
⑤IndexError 索引超出范围区间 MemoryError 需求存储空间超出范围
⑥KeyError 在映射中没有这个键 ValueError 输入无效参数
⑦ TypeError 数据类型错误 SyntaxError 语法错误
⑧NameError 对象名未申明
⑨ZeroDivisionError 除数为0
⑩SystemError 直译器的系统错误
"""
# ----------try except finally-----
def division(x,y):
try:
return x/y
except ZeroDivisionError:
print('Error')
finally:
print('阶段任务完成---')
print(division(4,2))
print(division(5,0))
print(division(3,1))
异常:当检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误❌的提示。
# 异常的语法
try:
可能发生错误的代码
except:
如果出现异常执行的代码
else:
没有异常执行的代码
finally:
无论是否异常都要执行的代码
一般try下方只放一行尝试执行的代码。
以
r方式打开一个不存在的文件
open('test.txt','r')
# FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
尝试以
r模式打开文件,如果文件不存在,则以w方式打开。
try:
f=open('test.txt','r')
except:
f=open('test.txt','w')
1. 了解异常类型
如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。
×××Error(异常类型):***(异常信息)
# NameError
# print(num) # NameError: name 'num' is not defined
# ZeroDivisionError
print(1/0) # ZeroDivisionError: division by zero
2. 捕获异常
2.1 捕获指定异常类型
try:
print(num) # NameError
except NameError:
print('有错误') # 有错误
try:
print(1/0) # ZeroDivisionError
except NameError:
print('有错误') # ZeroDivisionError: division by zero
2.2 捕获多个指定异常
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except后,并使用元组的方式进行书写。
try:
print(1/0) # ZeroDivisionError
except (NameError,ZeroDivisionError):
print('有错误') # 有错误
2.3 捕获异常描述信息
try:
print(1/0) # ZeroDivisionError
except (NameError,ZeroDivisionError) as result:
print(result) # division by zero
2.4 捕获所有异常
Exception是所有重写异常类的父类。
try:
print(1/0) # ZeroDivisionError
except Exception as result:
print(result) # division by zero
3. 异常的else
try:
print(1) #1
except Exception as result:
print(result) # division by zero
else:
print('else后是没有异常时执行的代码') #else后是没有异常时执行的代码
4. 异常的finally
finally表示的是无论是否异常都要执行的代码,例如关闭文件。
try:
f=open('test.txt','r')
except Exception as result:
f=open('test.txt','w')
else:
print('没有异常')
finally:
f.close()
5. 异常的传递
5.1 命令提示符运行py文件
文件资源管理器中找到文件路径,输入cmd,回车

python3 文件名
文件名可以输一部分,然后用tab自动补全。
5.2 异常传递
从外层的try-except传到内层的try-except
需求︰
1.尝试只读方式打开test.txt文件,如果文件存在则读取文件内容,文件不存在则提示用户即可。
⒉读取内容要求︰尝试循环读取内容,读取过程中如果检测到用户意外终止程序,则except捕获异常并提示用户。
text.txt:

import time
try:
f=open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
print('意外终止了读取数据')
# 如果再读取文件过程中,产生了异常那,那么就会捕捉到
# 比如 按下ctrl+c(cmd里)
finally:
f.close()
print('关闭文件')
except:
print('该文件不存在')

6. 自定义异常
自定义异常作用:用来将不满足程序逻辑的情况进行反馈。
在Python中,抛出自定义异常的语法为raise 异常类对象。
# 自定义异常类
class 异常类类名(Exception):
代码
# 设置抛出异常的描述信息
def __str__(self):
return ...
# 抛出异常
raise 异常类名
# 捕获异常
except Exception...
需求︰密码长度不足,则报异常(用户输入密码,如果输入的长度不足3位,则报错,即抛出自定义异常,并捕获该异常)。
# 自定义异常类,继承Exception
class ShortInputError(Exception):
def __init__(self,length,min_len):
self.length = length
self.min_len =min_len
# 设置抛出异常的描述信息
def __str__(self):
return f'你输入的长度是{self.length},要求不少于{self.min_len}个字符'
def main():
try:
password=input('请输入密码:')
if len(password)<3:
raise ShortInputError(len(password),3)
except Exception as result:
print(result)
else:
print('密码已经输入完成')
main()
"""
请输入密码:1
你输入的长度是1,要求不少于3个字符
请输入密码:1a3
密码已经输入完成
"""


浙公网安备 33010602011771号