系列文章目录
文章目录
- 系列文章目录
- 一、异常的概念
- 二、异常处理
- 三、抛出异常和自定义异常类
一、异常的概念
异常就是程序运行过程中,会影响程序正常执行的事件。
比如,除数为0异常,运行1 / 0
,就会在终端输出异常信息:
Traceback (most recent call last):
File "/home/task.py", line 1, in <module>
1 / 0
ZeroDivisionError: division by zero
- 1
- 2
- 3
- 4
异常信息包括三部分:
- 定位信息:指出是哪个文件的哪一行代码抛出了异常,上面第2行异常信息就是定位信息;
- 异常的类型:指出该异常属于哪一类,比如
AttributeError
试图访问一个对象没有的属性、IOError
输入/输出异常,上面第4行中冒号前面的ZeroDivisionError
就是异常的类型。 - 异常描述:指出具体出现了什么异常。上面第4行中冒号后面的,就是异常描述。
二、异常处理
程序出现异常就会停止运行。为此,我们必须做一些处理,消除异常,让程序可以继续运行下去,增强程序的健壮性。
-
异常处理:
python有专门的语法来应对可能出现的异常,语法格式如下:
try: 有可能出现异常的代码 except 异常类型1 as 别名: 对该类型异常的处理措施 except (异常类型2,异常类型3): 对异常类型2或类型3的处理措施 …… except Exception as 别名: 对该类型异常的处理措施 else: try中的代码没有发生异常时,所要执行的代码 finally: 不管有没有异常,都要执行的代码
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 异常类型后面的
as 别名
不是必须的,如果你需要使用异常类型这个信息(比如要保存到日志中),则要用这个语法。 try
后面可以有0到n个except
。try
后面可以只有finally
,但不能只有else
。else
必须和except
配合使用。- 第11行中的**
Exception
可以代表任何类型的异常**,它是所有异常类型的父类。
-
异常的传递:
当函数/方法执行出现异常,会将异常传递给 函数/方法 的调用一方,如果传递到主程序,仍然没有异常处理,程序才会被终止
三、抛出异常和自定义异常类
-
抛出异常:
在有些情况下,我们需要主动抛出异常。比如:提示用户输入密码,如果长度少于 8,抛出异常。
抛出异常的语法为
raise 异常类的实例对象
。 -
举例:
def input_password(): pwd = input("请输入密码:") # 判断密码长度,如果长度 >= 8,返回用户输入的密码 if len(pwd) >= 8: return pwd # 密码长度不够,需要抛出异常 # 创建异常对象 ex = Exception("密码长度不够") # 抛出异常对象 raise ex try: user_pwd = input_password() print(user_pwd) except Exception as result: print("发现错误:%s" % result)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
-
自定义异常类:
在上面的例子中,我们只是简单的实例化了
Exception
类,然后抛出。我们也可以像下面这样自己定义异常类,然后抛出实例对象。自定义异常类必须继承
Exception
类:class InputError(Exception): '''当输出有误时,抛出此异常''' #自定义异常类型的初始化 def __init__(self, value): self.value = value # 返回异常类对象的说明信息 def __str__(self): return ("无效的输入") try: raise InputError(1) # 抛出 MyInputError 这个异常 except InputError as err: print(err) # 打印:无效的输入
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
下一篇