python学习笔记 | 异常处理

什么是异常?

异常就是程序运行时发生错误的信号(在程序出现错误时,则会产生一个异常,若程序没有处理它,则会抛出该异常,程序的运行也随之终止)。

异常种类

在python中不同的异常可以用不同的类型(python统一了类与类型,类型即类)去标识,一个异常标识一种错误。

Python所有的错误都是从BaseException类派生的,如Exception类,而大部分的错误类型又是从Exception类中派生的。常见的错误类型和继承关系看这里 👇

https://docs.python.org/3/library/exceptions.html#exception-hierarchy

AttributeError 试图访问一个没有对象的类型,比如foo.x,但foo没有属性x
IOError 输入/输出异常;通常是无法打开文件
ImportError 无法引入模块或包;通常是路径问题或导入名称有错
IndentationError 语法错误(的子类);通常是代码没有补全或缩进
IndexError 下标索引超出序列边界,比如当列表D的长度只有3时,试图访问D[4]
KeyError 试图访问字典中不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还没声明的变量
SyntaxError python代码非法,代码不能编译
TypeError 传入对象类型与要求的不符合
ValueError 传入一个调用者不期望的值,即使值的类型是正确的;如int(‘Mormont’)
UnboundLocalError 试图访问一个还未被设置的局部变量,通常是由于另有一个同名的全局变量
Exception 万能异常
AssertionError 断言异常
RecursionError 递归异常,python默认的递归深度是很有限的(默认是1000)

异常处理

为了保证程序的健壮性和容错性,在遇到错误时程序不会崩溃,我们需要对异常进行处理。

if

如果这个错误是可预见的,可以使用if语句在错误发生之前进行预防

lst = [1,45,2.4,'提利昂·兰尼斯特',8]
for i in lst:
    if i.__class__ == str:
        continue
    print(int(i),end=',') # 1,45,2,8,

try…except…

如果这个错误是不可预见的,则需要用到try...except语句。

1. 多分支异常

lst = [1, 45, 2.4, 'Tyrion Lannister', 8]
for i in lst:
    try:
        print(int(i), end=',')        
    except ValueError as e:
        print(repr(e))
    except IndexError as e:
        print(repr(e))
    except AtrributeError as e:
        print(repr(e))
    except Exception as e:
        print(repr(e))
    else:
        print("") # try无异常,则执行这一句
   	finally:
      	print("") # 异常与否,都会执行这一句

2. 主动触发异常

try:
    name = "Imp"
    if name.__class__ == str:
        raise ValueError('类型异常',i)
except ValueError as e:
    print(repr(e)) # ValueError('类型异常', 'Imp')

3. 断言异常

'''格式: assert expression [, arguments]'''
try:
    name = "Jaime Lannister"
    assert name == "Tyrion Lannister", "name must be Jamie Lannister"
except AssertionError as e:
    print(repr(e)) # AssertionError('name must be Jamie Lannister')

4. 自定义异常

class CustomError(BaseException):
    def __init__(self, msg):
        self.msg = msg
    def __str__(self):
        return self.msg
try:
    raise CustomError('error')
except CustomError as e:
    print(repr(e)) # CustomError('error')
class KFCError(BaseException):
    def __str__(self):
        return 'KFC Crazy Thursday v me ¥50.'


raise KFCError


951 字