6.1_9 Python3.x入门 P9 【异常Error】常见Error、异常捕获try catch

相关链接



一、Error

常见Error

1) SyntaxError:语法错误
2) TypeError:类型错误
3) NameError:未声明/初始化对象(没有属性)
4) IndexError:索引越界
5) ZeroDivisionError:除数为0
6) KeyError:映射中没有这个键
7) ValueError:传入无效的参数

1.1 层级结构

BaseException  # 所有异常的基类
 +-- SystemExit  # 解释器请求退出
 +-- KeyboardInterrupt  # 用户中断执行(通常是输入^C)
 +-- GeneratorExit  # 生成器(generator)发生异常来通知退出
 +-- Exception  # 常规异常的基类
      +-- StopIteration  # 迭代器没有更多的值
      +-- StopAsyncIteration  # 必须通过异步迭代器对象的__anext__()方法引发以停止迭代
      +-- ArithmeticError  # 各种算术错误引发的内置异常的基类
      |    +-- FloatingPointError  # 浮点计算错误
      |    +-- OverflowError  # 数值运算结果太大无法表示
      |    +-- ZeroDivisionError  # 除(或取模)零 (所有数据类型)
      +-- AssertionError  # 当assert语句失败时引发
      +-- AttributeError  # 属性引用或赋值失败
      +-- BufferError  # 无法执行与缓冲区相关的操作时引发
      +-- EOFError  # 当input()函数在没有读取任何数据的情况下达到文件结束条件(EOF)时引发
      +-- ImportError  # 导入模块/对象失败
      |    +-- ModuleNotFoundError  # 无法找到模块或在在sys.modules中找到None
      +-- LookupError  # 映射或序列上使用的键或索引无效时引发的异常的基类
      |    +-- IndexError  # 序列中没有此索引(index)
      |    +-- KeyError  # 映射中没有这个键
      +-- MemoryError  # 内存溢出错误(对于Python 解释器不是致命的)
      +-- NameError  # 未声明/初始化对象 (没有属性)
      |    +-- UnboundLocalError  # 访问未初始化的本地变量
      +-- OSError  # 操作系统错误,EnvironmentError,IOError,WindowsError,socket.error,select.error和mmap.error已合并到OSError中,构造函数可能返回子类
      |    +-- BlockingIOError  # 操作将阻塞对象(e.g. socket)设置为非阻塞操作
      |    +-- ChildProcessError  # 在子进程上的操作失败
      |    +-- ConnectionError  # 与连接相关的异常的基类
      |    |    +-- BrokenPipeError  # 另一端关闭时尝试写入管道或试图在已关闭写入的套接字上写入
      |    |    +-- ConnectionAbortedError  # 连接尝试被对等方中止
      |    |    +-- ConnectionRefusedError  # 连接尝试被对等方拒绝
      |    |    +-- ConnectionResetError    # 连接由对等方重置
      |    +-- FileExistsError  # 创建已存在的文件或目录
      |    +-- FileNotFoundError  # 请求不存在的文件或目录
      |    +-- InterruptedError  # 系统调用被输入信号中断
      |    +-- IsADirectoryError  # 在目录上请求文件操作(例如 os.remove())
      |    +-- NotADirectoryError  # 在不是目录的事物上请求目录操作(例如 os.listdir())
      |    +-- PermissionError  # 尝试在没有足够访问权限的情况下运行操作
      |    +-- ProcessLookupError  # 给定进程不存在
      |    +-- TimeoutError  # 系统函数在系统级别超时
      +-- ReferenceError  # weakref.proxy()函数创建的弱引用试图访问已经垃圾回收了的对象
      +-- RuntimeError  # 在检测到不属于任何其他类别的错误时触发
      |    +-- NotImplementedError  # 在用户定义的基类中,抽象方法要求派生类重写该方法或者正在开发的类指示仍然需要添加实际实现
      |    +-- RecursionError  # 解释器检测到超出最大递归深度
      +-- SyntaxError  # Python 语法错误
      |    +-- IndentationError  # 缩进错误
      |         +-- TabError  # Tab和空格混用
      +-- SystemError  # 解释器发现内部错误
      +-- TypeError  # 操作或函数应用于不适当类型的对象
      +-- ValueError  # 操作或函数接收到具有正确类型但值不合适的参数
      |    +-- UnicodeError  # 发生与Unicode相关的编码或解码错误
      |         +-- UnicodeDecodeError  # Unicode解码错误
      |         +-- UnicodeEncodeError  # Unicode编码错误
      |         +-- UnicodeTranslateError  # Unicode转码错误
      +-- Warning  # 警告的基类
           +-- DeprecationWarning  # 有关已弃用功能的警告的基类
           +-- PendingDeprecationWarning  # 有关不推荐使用功能的警告的基类
           +-- RuntimeWarning  # 有关可疑的运行时行为的警告的基类
           +-- SyntaxWarning  # 关于可疑语法警告的基类
           +-- UserWarning  # 用户代码生成警告的基类
           +-- FutureWarning  # 有关已弃用功能的警告的基类
           +-- ImportWarning  # 关于模块导入时可能出错的警告的基类
           +-- UnicodeWarning  # 与Unicode相关的警告的基类
           +-- BytesWarning  # 与bytes和bytearray相关的警告的基类
           +-- ResourceWarning  # 与资源使用相关的警告的基类。被默认警告过滤器忽略。

1.2 SyntaxError语法错误

'''示例1 (类型错误)
'''
age = input('请输入你的年龄')
if age >= 18 # SyntaxError: invalid syntax
    print("1")
'''示例2 (=和==混用)
'''
name=input()
if name='admin' :print("login") # SyntaxError: invalid syntax
'''示例3 (末尾缺少冒号、或用中文冒号)
'''
for i in range(1,5) # SyntaxError: invalid syntax
    print(i)

1.3 TypeError类型错误

'''示例1 (字符串拼接时 数字+字符串混合)
'''
str = 'a'+5
print(str) # TypeError: can only concatenate str (not "int") to str
'''示例2 (方法只需要一个参数)
'''
lst=[]
lst.append('a','b') #TypeError: append() takes exactly one argument (2 given)

1.4 NameError未声明对象

'''示例1 (没有定义变量)
'''
while i < 10 : #NameError: name 'i' is not defined
    print(i)

1.5 IndexError-索引越界

'''示例1 (索引从0开始计数)
'''
lst=[1,2,3]
# print(lst[3])#IndexError: list index out of range

二、异常捕获与处理

  当发生异常时,我们就需要对异常进行捕获,然后进行相应的处理。python的异常捕获常用try…except…结构,把可能发生错误的语句放在try模块里,用except来处理异常,每一个try,都必须至少对应一个except。此外,与python异常相关的关键字主要有:

关键字关键字说明
try/except捕获异常并处理
pass忽略异常
as定义异常实例 (except Exception as e)
else如果try中的语句没有发生异常,则执行else中的语句
finally无论是否出现异常,都执行的代码
raise抛出/引发异常

2.1 pycharm快捷键

  快捷键 for mac:左command(⌘) + option(⌥ ) + t
  快捷键 for windows:ctrl + alt + T

在这里插入图片描述

2.2 基本语法

简单捕获
try:
     <语句>
except:
      print('异常')
常用捕获
try:
     <语句>
except Exception as e:
      print(e)
多次捕获
try:
     <语句>
     
except <异常名1>:
      print('异常1')
      
except <异常名2>:
      print('异常2')
      
except <异常名3>:
      print('异常3')
捕获完整结构
try:
     <语句>
     
except <异常名1>:
      print('异常1')
      
except <异常名2>:
      print('异常2')
      
else:
	<语句>

finally:
	<语句>

2.3 raise主动触发异常

主动触发异常也是一种保护,如数值类型不对,值大小不对等等问题
语法为:

raise [Exception [, args [, traceback]]]
案例
def not_zero(num):
    try:
        if num == 0:
            raise ValueError('错误')
        return num
    except Exception as e:
        print(e)
        
not_zero(0)  # 错误

2.4 traceback追溯

  除了使用 sys.exc_info() 方法获取更多的异常信息之外,还可以使用 traceback 模块,该模块可以用来查看异常的传播轨迹,追踪异常触发的源头。

try:
    block

except:
    traceback.print_exc()

2.5 异常捕获案例

def division():
    while True:
        try:
            a = float(input('请输入第一个整数:'))
            b = float(input('请输入第二个整数:'))
            result = f'{a / b:.2f}'
        except Exception as e:
            print(e)
            continue # 进入下次循环
        else:
            print("没有抛出异常")
            return result
        finally:
            print("end loop")

class main:
    print('结果为',division())


'''测试结果
请输入第一个整数:22
请输入第二个整数:4f
could not convert string to float: '4f'
end loop
请输入第一个整数:10.68
请输入第二个整数:3.3
没有抛出异常
end loop
结果为 3.24
'''

三、Pycharm程序调试 Debug

断点: 程序运行到此处,暂时挂起,停止执行,此时可以详细观察程序的运行情况(各个参数的取值),方便做出进一步判断。

在这里插入图片描述

进入调试: 点击工具栏上的debug按钮。

在这里插入图片描述

开始调试: Console可以查看控制台输出内容,Debugger查看当前变量值。

在这里插入图片描述


22/07/01

M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值