目录
一、前言
程序在运行时,如果遇到错误的代码,程序就会结束执行、抛出代码异常。那么如何在程序执行遇到错误代码时,对错误的代码进行处理或者直接跳过异常继续执行后面的代码?这就需要编程语言中的异常处理机制了。
二、错误类型
错误类型如下:其实这些异常类型都是类名。
异常 | 导致的错误 |
AssertionError | 当assert语句失败时引发。 |
AttributeError | 当属性分配或引用失败时引发。 |
EOFError | 当input()函数达到文件结束条件时引发。 |
FloatingPointError | 当浮点运算失败时引发。 |
GeneratorExit | 调用生成器的close()方法时引发。 |
ImportError | 找不到导入的模块时引发。 |
IndexError | 当序列的索引超出范围时引发。 |
KeyError | 在字典中找不到键时引发。 |
KeyboardInterrupt | 当用户按下中断键(Ctr1+c或delete)时引发。 |
MemoryError | 当操作耗尽内存时引发。 |
NameError | 在局部或全局范围内找不到变量时引发。 |
NotImplementedError | 由抽象方法提出 |
OSError | 当系统操作导致系统相关错误时引发。 |
OverflowError | 当算术运算的结果太大而无法表示时引发。 |
ReferenceError | 使用弱引用代理访问垃圾收集的引用时引发。 |
RuntimeError | 当错误不属于任何其他类别时引发。 |
StopIteration | 函数引发,以指示迭代器不再返回任何项。 |
SyntaxError | 遇到语法错误时由解析器引发。 |
IndentationError | 当缩进不正确时引发。 |
TabError | 当缩进由不一致的制表符和空格组成时引发。 |
SystemError | 当解释器检测到内部错误时引发。 |
SystemExit | 由sys .exit( )函数引发。 |
TypeError | 将函数或操作应用于类型不正确的对象时引发。 |
UnboundLocalError | 当在函数或方法中引用局部变量,但没有将值绑定到该变量时引发。 |
UnicodeError | 当发生与unicode相关的编码或解码错误时引发。 |
UnicodeEncodeError | 当编码过程中发生与unicode相关的错误时引发。 |
UnicodeDecodeError | 当解码过程中出现与unicode相关的错误时引发。 |
UnicodeTranslateError | 翻译过程中发生与unicode相关的错误时引发。 |
ValueError | 当函数得到类型正确但值不正确的参数时引发。 |
ZeroDivisionError | 当除法或模运算的第二个操作数为零时引发。 |
三、实现方式1
try:
可能出现语法错误的代码块
except 要捕获的错误类型 as 任意变量:
捕获到错误执行的代码块
四、实现方式2
try:
可能出现错误的代码块
except Exception as 任意变量:
捕获到任意错误类型执行的代码块
else:
没有捕获到错误执行的代码块
finally:
不管有没有出错都必须执行的代码块
说明:
1、try: 对可能出错的代码块进行语法异常检测
2、except: “Exception” 指的是任意错误类型,只要try中有语法错误的代码块,则都会被except进行处理;通常在不知道try中的代码错误类型的情况下使用。可以有多个except语句、但只执行一次。
3、else:只有在try代码块中没有检测到语法错误的情况下才会执行执行,如果检测到了错误就不执行。
4、finally: 不管在try中是否捕获到代码语法错误,都必须执行。
*不需要在每个可能出错的地方都使用异常处理、只需要在合适的层次去捕获异常错误就可以了,这样可以减少写"try-except"。
五、异常抛出机制
程序在运行时如果碰到代码语法异常,则会在当前函数中查找相应错误类型的异常捕获即查找由except指定的错误类型;如果在当前函数中没有找到相应的异常捕获错误类型,则会将异常传递给上层的调用函数看是否能够处理;如果在函数调用的最外层还没找到相应错误捕获类型,则程序就会运行停止退出并抛出异常。
5.1自定义异常
在实际开发过程中,python内置错误异常类型可能无法满足开发者需求,因此开发者可以根据自身需求条件自定义异常类,然后抛出异常类中的处理信息;之后使用"try-except"异常检测机制来捕获开发者抛出的异常信息。
注意: 自定义异常类需继承Error或Exception父类。开发者根据错误条件使用“raise”关键字来抛出异常。
说明:
以上自定义异常中,fun_name() 函数中的raise关键字是用来抛出异常即产生异常,这个异常类型为类名。然后surprise(name,len(name))会创建一个实例对象,并自动将__str__方法中的返回值作为异常类型:"suprise"的提示信息,并返回实例对象的地址。
然后由except来捕获raise抛出的异常类(错误类型)即surprise;并将异常类创建的实例对象地址赋值给msg。这样msg和surprise(name,len(name))指向的是同一个实例对象,但直接打印msg的话是异常类的错误提示信息。
@声明:“山月润无声”博主知识水平有限,以上文章如有不妥之处,欢迎广大IT爱好者指正,小弟定当虚心受教!