Appearance
和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 | 未声明/初始化对象 | 读取一个尚未定义的变量会产生此异常 |
SyntaxError | Python | 出现语法错误时,会产生 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 | 尚未实现的方法 |
SyntaxError | Python |
IndentationError | 缩进错误 |
TabError | Tab |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode |
UnicodeDecodeError | Unicode |
UnicodeEncodeError | Unicode |
UnicodeTranslateError | Unicode |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |