python异常处理 概述

本文深入探讨了Python中的异常处理机制,详细列举了常见的错误类型及其解决策略,通过实例讲解了try-except-else-finally语句的使用,并介绍了如何自定义异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码运行可能会意外各种错误
程序的逻辑错误、用户输入不合法等都会引发异常,但它们不会导致程序崩溃
可以利用python提供的异常处理机制,在异常出现时及时捕获并从内部消化掉

代码错误类型

类名描述
AssertionError当assert语句失败时引发该异常
AttributeError对象不存在此属性
BaseException所有异常的基类
Exception常规异常的基类
ImportError当导入一个模块失败时引发该异常
IndexError序列中无此索引/下标越界
IOError输入/输出操作失败
KeyboardInterrupt用户中断执行(通常输入Ctr-C)
KeyError映射中不存在此键
MemoryError内存耗尽
NameError找不到名字(变量)
OverflowError当算术运算结果超出表示范围时引发该异常
RecursionError当超过最大递归深度时引发该异常
RuntimeError当产生其他所有类别以外的错误时引发该异常
StopIteration当迭代器中没有下一个可获取的元素时引发该异常
SyntaxErrorPython语法错误
TabError当使用不一致的缩进方式时引发该异常
TypeError对类型无效的操作
UnboundLocalError引用未赋值的局部变量时引发该异常
ValueError传入无效的参数
ZeroDivisionError除(或取模)运算的第二个参数为0
FileExistsError当要创建的文件或目录已存在时引发该异常
FileNotFoundError当要访问的文件或目录不存在时引发该异常

错误实例举例

语法错误:SyntaxError

‘>>>print ‘bee’
SyntaxError: Missing parentheses in call to ‘print’. Did you mean print(‘bee’)?

除以0错误:ZeroDivisionError

'>>> a=0;5/a
Traceback (most recent call last):
ZeroDivisionError: division by zero

下标越界:IndexError 最为常见
这种包括列表、元组和字符串,普遍存在。

’>>> al=[1,2,3,4];al[4]
IndexError: list index out of range

类型错误:TypeError

‘>>> ls=[1,‘2’];ls.sort()
TypeError: ‘<’ not supported between instances of ‘str’ and ‘int’

访问变量不存在:NameError
引用变量前并没有赋值,包括函数、类等未定义都会引发NameError错误

’>>> x+=1
NameError: name ‘x’ is not defined

字典关键字不存在:KeyError
上述提到了下标越界错误,对字典来说,存在类似错误如上。
引发的错误还会提示不存在的关键字是什么。

‘>>> d={1:2};d[2]
Traceback (most recent call last):
KeyError: 2

未知的变量属性:AttributeError

’>>> l=[];l.sorted()
AttributeError: ‘list’ object has no attribute ‘sorted’
——
如上sorted是内置函数,列表类中不存在方法sorted

以上这些错误会引起程序中止退出,如果希望掌控意外,就需要在可能出错误的地方设置陷阱捕捉错误

异常处理

try-except-else-finally语句

try:
 	<检测语句>
except <错误类型> [as e]:
 	<处理异常>
else:
	<未发生错误而运行的代码>
finally:
	<无论是否发生错误都一定会运行的代码>

针对不同异常可以设置多个except,一个except多个异常项则以元组形式表示。

如果不标注错误类型,则捕捉所有的错误;如果标注错误类型,则仅捕捉该异常。

异常具有传递机制,如果调用函数中某处抛出的异常没有被捕捉处理的话就会一层层传递到上一级调用处,直到被捕捉,如果一直未被捕捉,程序就会因为异常结束。

产生错误

产生错误raise

给定一个输入input,如何控制用户输入的内容?
我们可以使用关键字raise产生异常,与while True和break组合使用来控制输入的内容。
raise关键字是用来产生异常的,一般来说需要内置的异常类型,但是也可以自行创建异常类型。

while True:
    try:
        a=input()
        if not a.isdigit():raise ValueError
        else:break
    except:print('请输入纯数字!')
print('hi!')

断言assert

使用关键字assert可以判断一个条件是否成立,如果成立则继续执行后面的语句;如果不成立则会引发AssertionError异常

while True:
    try:
        a=input()
        assert a.isdigit()
        break
    except:print('请输入纯数字!')
print('hi!')

自定义异常

自定义异常,实际上就是以BaseException类作为父类创建一个子类。

class HanPiError(BaseException):
    def __init__(self,a):
        self.yala=a
    def __str__(self):
        return self.yala

while True:
    try:
        a=input('请输入:')
        if not a.isdigit():raise HanPiError\
            ('输入错误,输入内容为%s,请输入纯数字!'%a)
        else:break
    except HanPiError as e:
        print(e)
print('输入正确!')

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值