Skip to content

和java相同,Python中也有异常处理的方式,毕竟谁写的程序也不能保障永远不出问题,因此异常处理就尤为重要。

python
try:
	可能发生异常的代码块
except 异常类型:
	处理异常的代码块

上述代码是Python中的异常处理方式,其中except后的异常类型可以省略。来看下面的案例,up函数是转换字母为大写,如果传递数字或其他非法字符则报错。

python
def up(str_data):
    try:
        return str_data.upper()
    except:
        print("您传入了非法参数")
        return str_data

print(up(110))

捕获通用异常

上述代码有什么问题?如果是从用户的角度,那当然没什么问题,如果是需要我们调试呢?

对于这个简单的程序,我们能分析出可能出错的原因,但对于复杂的程序来说,我们并没有办法判断其问题所在,因此控制台还是需要打印异常的错误信息,使用方式如下:

python
def up(str_data):
    try:
        return str_data.upper()
    except Exception as e:
        print(e)                      # 打印异常信息
        return str_data

捕获多个异常

和java相同,Exception相当于是其他异常的父类,能捕获所有异常,但是也会出现捕获多个的异常的情况,写法如下(如果又多个异常Exception建议写在最后一个)。

python
def up(str_data):
    try:
        return str_data.upper()
    except (AttributeError, Exception) as e:
        print(e)
        return str_data

需求:希望不同的异常分开处理,使用方式如下所示

python
def up(str_data):
    try:
        str_data = str_data.upper()
    except AttributeError as e:            # 处理AttributeError异常
        print("您传入了非法参数")
    except Exception as e:                 # 处理Exception异常
        print(e)
    return str_data

常见的异常类型

官方为我们定义了一些常见的异常类型,更多的放在本篇文章末尾的位置了,常见的异常如下表所示:

异常名称简述详细说明
ZeroDivisionError除(或取模)零进行除法运算时,要求被除数不能是 0,如果被除数是 0,则会产生异常
AssertionError断言语句失败编写代码时,常常需要在某些特定的位置做出一些假设,假设某些条件为真
AttributeError对象没有这个属性如果没有定义指定名称的属性,则会抛出 AttributeError 类型的异常
FileNotFoundError文件不存在文件不存在时出现
ModuleNotFoundError模块不存在模块不存在时出现
IndexError序列中没有此索引(index)使用list[index]的形式访问列表list的指定位置的元素,如果index非法则产生此异常
KeyError映射中没有这个键字典中没有这个key,但是程序却调用不存在的key时出现
NameError未声明/初始化对象读取一个尚未定义的变量会产生此异常
SyntaxErrorPython出现语法错误时,会产生 SyntaxError 类型的异常
IndentationError缩进错误程序中出现缩进的语法错误时,会产生IndentationError类型的异常。

异常中的finally

在异常处理中,finally关键字用于指定无论是否发生异常都需要执行的代码块,常用于释放连接池或IO等。

python
def up(str_data):
    try:
        str_data = str_data.upper()
    except AttributeError as e:
        print("您传入了非法参数")
    finally:
        print('无论如何我都会执行')
    return str_data

Python 的标准异常类型总结

异常名称描述
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(generator)发生异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python
NameError未声明/初始化对象
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython
IndentationError缩进错误
TabErrorTab
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeErrorUnicode
UnicodeDecodeErrorUnicode
UnicodeEncodeErrorUnicode
UnicodeTranslateErrorUnicode
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告