跳至内容

Python 异常

异常是指在程序运行期间发生了一些不可预测的事件。

常见的异常有:

  • 打开不存在的文件
  • 除0运算
  • 导入不存在的模块

等等

例如

python
div_zero = 1 / 0


# 输出:
# Traceback (most recent call last):
#  File "<string>", line 1, in <module>
# ZeroDivisionError: division by zero
div_zero = 1 / 0


# 输出:
# Traceback (most recent call last):
#  File "<string>", line 1, in <module>
# ZeroDivisionError: division by zero

以上,是一个典型的 除0 异常

内置异常

Python提供了大量的内置异常类型。我们可以通过 locals() 函数查看。

python
print(dir(locals()['__builtins__']))
print(dir(locals()['__builtins__']))

内置异常清单

异常描述
AssertionError断言失败异常
AttributeError属性赋值或引用异常
EOFErrorinput()击中文件尾异常
FloatingPointError浮点计算异常
GeneratorExit生成器退出异常
ImportError模块导入不存在异常
IndexError索引越界异常
KeyError字典中key不存在异常
KeyboardInterrupt按键中断异常(Ctrl+C 或 Delete)
MemoryError内存溢出异常
NameError变量名不存在异常
NotImplementedError抽象方法异常
OSError操作系统异常
OverflowError算术运算溢出异常
ReferenceError弱引用访问垃圾回收引用异常
RuntimeError运行时不属于其他类别的异常
StopIteration迭代器next()函数遍历结束异常
SyntaxError语法错误异常
IndentationError错误缩进异常
TabError缩进不一致异常(Tab和空格)
SystemError解释器内部错误异常
SystemExitsys.exit()触发的异常
TypeError类型错误异常
UnboundLocalError作用域越界异常
UnicodeErrorUnicode编解码异常
UnicodeEncodeErrorUnicode编码异常
UnicodeDecodeErrorUnicode解码异常
UnicodeTranslateErrorUnicode转码异常
ValueError值异常
ZeroDivisionError除0异常

用户自定义异常

除了系统内置异常外,有时为了满足开发需要,还会创建自定义异常。

新建的用户自定义异常一般继承自内置异常类Exception

创建语法

python
# 定义异常类
class CustomError(Exception):
    pass

# 捕获处理异常
try:
    pass
except CustomError:
    pass
# 定义异常类
class CustomError(Exception):
    pass

# 捕获处理异常
try:
    pass
except CustomError:
    pass

异常示例

python
# 定义非常年龄异常
class InvalidAgeError(Exception):
    pass

try:
    input_age = 12
    if input_age < 18:
        # 抛出异常
        raise InvalidAgeError
    else:
        print("成人许可")
# 捕捉异常
except InvalidAgeError:
    print("未满18岁,否决")


# 输出:
# 未满18岁,否决
# 定义非常年龄异常
class InvalidAgeError(Exception):
    pass

try:
    input_age = 12
    if input_age < 18:
        # 抛出异常
        raise InvalidAgeError
    else:
        print("成人许可")
# 捕捉异常
except InvalidAgeError:
    print("未满18岁,否决")


# 输出:
# 未满18岁,否决

提示

  1. 大型程序中,用户自定义异常通常会放置到一个文件中。
  2. 很多标准库的通用做法是自定义异常会单独放到exceptions.py或errors.py中。

错误和异常的区别

  • 错误:是指超出程序控制,在代码运行前的语法或者逻辑错误。包括编译错误,语法错误,逻辑错误,库兼容性错误,无限循环等。错误不应该做兼容处理,需要改掉错误。
  • 异常:是指程序运行期间超出预期的行为。异常应该捕捉且有兼容性处理。