一、语法错误
如果错误信息是以SyntaxError
开头,这就是说明Python解释器认为这是一个语法错误,同时Python会很贴心地提示你在哪个文件的第几行的第几个字符开始出错(虽然有时候错误位置可能不准确)。语法错误通常意味着我们使用的Python书写格式或者使用方式式不正确的,Python不会完整运行带有语法错误的程序。这时候我们只需要安装提示查阅Python基础语法,修改相关错误内容即可。
二、异常
即使Python程序的语法是正确的,但是在运行的时候也可能会发生一些预想之外的错误。运行时检测到的错误被称为异常,有些错误可能并不是致命的,但如果程序对大多数的异常都不做处理,Python解释器会输出异常信息到屏幕上并终止程序。例如:
异常示例1:
异常示例2:
异常示例3:
异常示例4:
Python中还存在其他形形色色的异常类型,可自行查阅官方文档了解更多Python内置的异常。
三、处理异常
异常是在程序运行时才会检测到的错误,有时候是不可预期的。有些错误也不是致命的,我们并不希望它们影响程序的完整运行,Python提供了友善的方式可以让我们处理一些异常。
例如:我们不断让用户输入数字并检测用户输入的是否是数字
运行这个例子会让用户不断地输入内容(按下Ctrl+C组合键可以停止该程序),如果用户输入的是数字,则程序会不断地运行;如果用户输入的是非数字内容,则程序会输出错误并且退出:
我们看到输出的错误信息是ValueError
,这告诉我们“abcd”没办法转化为数字。我们并不能预见用户会输入什么数据,只有在程序运行的时候用户输入了错误内容,程序才会出错。这是一个典型的异常,如果我们并不希望因为用户输入了一些不符合规范的数据而使程序出错不能运行(例如用户在手机APP上输入一下内容之后APP突然异常退出,这是非常不友好的体验),这时候我们就需要处理这些异常,确保程序不会无故退出。
关键字try
和except
用于捕获异常并让我们运行相应的代码去处理异常,try-except
语法如下:
在try
业务语法块中,产生任何的异常都会终止业务语法块并跳转到except
匹配异常类型。如果匹配得上,则运行处理异常的语法块,否则程序就报错退出,例如:
如果有多个except
,那么Python解释器会逐个匹配except
后的异常类型,如果匹配到则运行相应的处理异常的语法块,如果没有匹配到则输出异常并退出程序。由于大部分的异常都是从Exception
这个父类继承过来的,所以如果匹配的异常类型是Exception
,就总是可以匹配到所有异常。
四、抛出异常
使用raise
语句在Python中抛出一个指定的异常,例如:
手动抛出异常的时候,我们可以使用这个方法提示用户程序哪里出现了问题。之前碰到的TypeError
、ValueError
和NameError
等异常都是系统内建的异常。Python中内建了许多异常,常见的异常如下:
异常名称 | 描述 |
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是Ctrl+C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(Generator)发生异常来通知退出 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点数计算错误 |
OverflowError | 数值运算超过最大限制 |
ZeroDivisionError | 除(或取模)零(所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(Index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python解释器不是致命的) |
NameError | 为声明/初始化对象(没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak Reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python语法错误 |
IndentationError | 缩进错误 |
TabError | Tab和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的操作 |
UnicodeError | Unicode相关的错误 |
UnicodeDecodeError | Unicode解码时的错误 |
UnicodeEncodeError | Unicode编码时的错误 |
UnicodeTranslateError | Unicode转换时的错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(Runtime Behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
五、finally子语
Python中的finally
子句需要和try
子句一起使用,finally
子句在异常处理中的作用是:无论是否有异常或者是否捕获了异常,finally
子句都会保证执行。例如:
六、自定义异常
Python有许多内建的异常类,内建的异常类可以满足大部分需求,但还是会有Pyhton内建的异常无法满足需求的时候,Python也提供了自定义异常的方法。
自定义异常应该继承自Exception类,可以是直接继承,也可以是间接继承。例如: