python异常处理
一、异常处理
1. 概念
- 异常就是不正常,当python检测到一个错误时,解释器就无法继续执行下去了,出现了一些错误的提示,这就是所谓的异常。
2. 捕获异常
-
2.1 try---except
- 语法:
try: <语句> except <异常类名字>: <语句>
- 案例:从键盘输入被除数与除数,求商并打印
- 传统解决方法
a = input("请输入被除数:") b = input("请输入除数:") if a.isdigit() and b.isdigit(): a, b = int(a), int(b) if b != 0: print(a / b) else: print("除零错误") else: print("输入有误")
- 使用异常处理的解决方法
try: a = int(input("请输入被除数:")) b = int(input("请输入除数:")) print(a / b) except Exception: print("输入有误/除零错误")
- 传统解决方法
- 语法:
-
2.2 except 多个异常
- 语法:多个异常分开写(注意异常<父子>类的顺序)
try: <语句> except <异常类名字>: <语句> except <异常类名字>: <语句> else: # 如果没有异常发生 <语句>
- 语法:多个异常分开写(注意异常<父子>类的顺序)
-
2.3 多个异常写到一个元组中
- 语法:
try: 代码 except(Exception1[,Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码
- 语法:
-
2.4 获取异常信息
try: f = open('124.txt', 'r') f.write('HelloWorld') # 将捕获到的异常存储到到变量errMsg中 except IOError as errMsg: print(errMsg)
-
2.5 捕获所有异常
except 不带任何异常 try: a = 2/0 except: print("遇到异常")
except 父类Exception try: b = 3/0 except BaseException as result: print(result)
-
2.6 捕获异常中else的用法
try: b = 3/1 except BaseException as result: print(result) else: # 可以访问b的值 print("没有遇到异常,结果为:%d" % b)
-
2.7 try--- finally
- finally顾名思义: 最终,最后的意思
- 用处
- 确保最后一定要执行的
- 如:文件关闭、数据库关闭、socket关闭等
- 案例:(文件关闭问题)
try: f = open('123.txt', 'r') # 如果遇到异常,后续代码不再执行,直接执行except模块 f.write('HelloWorld') # 在这关闭文件是否合适 f.close() except IOError as errMsg: print(errMsg) else: print("写入文件成功") finally: # 最终一定要关闭文件(打印,验证是否执行) try: f.close() except NameError: print("文件不存在") else: print("finally,文件关闭")
3. 抛出自定义异常
3.1自定义异常
- 通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式
- 自定义异常类,直接或者间接继承Exception
class GenderException(Exception): def __init__(self): super().__init__() # args为BaseException的属性 self.args = '性别只能为男或者女' # 也可以自定义一个属性 self.msg = '性别只能为男或者女'
3.2手动抛出自定义异常
- 语法:
raise [Exception [, args [, traceback]]]
- 例:
class Student(object): def __init__(self, name, gender, age): self.__name = name self.setGender(gender) self.__age = age def setGender(self, gender): if gender == '男' or gender == '女': self.__gender = gender else: # 抛出一个自定义的性别异常(也可以以列表的形式抛出多个异常) # raise [GenderException(), Exception()] raise GenderException() try: stu1 = Student('大黄', '男1', 18) except GenderException as e: # 打印自定义的信息 print(e.msg) # 打印父类属性的信息 print(e.args)