异常

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
密码已经输入完成
"""
posted @ 2022-07-14 16:33  wakaki  阅读(62)  评论(0)    收藏  举报