python异常处理 概述

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

代码错误类型

类名 描述
AssertionError 当assert语句失败时引发该异常
AttributeError 对象不存在此属性
BaseException 所有异常的基类
Exception 常规异常的基类
ImportError 当导入一个模块失败时引发该异常
IndexError 序列中无此索引/下标越界
IOError 输入/输出操作失败
KeyboardInterrupt 用户中断执行(通常输入Ctr-C)
KeyError 映射中不存在此键
MemoryError 内存耗尽
NameError 找不到名字(变量)
OverflowError 当算术运算结果超出表示范围时引发该异常
RecursionError 当超过最大递归深度时引发该异常
RuntimeError 当产生其他所有类别以外的错误时引发该异常
StopIteration 当迭代器中没有下一个可获取的元素时引发该异常
SyntaxError Python语法错误
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('输入正确!')

以上。

发布了70 篇原创文章 · 获赞 15 · 访问量 4309

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/103405395