异常处理
1. 异常处理
错误指的是代码有语法问题,⽆法解释运⾏,必须改正后才能运⾏
如果代码没有语法问题,可以运⾏,但会出运⾏时的错误,例如除零错误,下标越
界等问题,这种在运⾏期间检测到的错误被称为异常 ,出现了异常必须处理否则
程序会终⽌执⾏,⽤户体验会很差。Phthon⽀持程序员⾃⼰处理检测到的异常。
可以使⽤try-except语句进⾏异常的检测和处理
1.1 try-except语句
语法:
try:
【代码块A】 #可能会出错误的代码 异常检测
except Exception1[ as e]: #异常处理
【代码块1】 #异常处理代码
except Exception2[ as e]: #异常处理
【代码块2】 #异常处理代码
....
except Exceptionn[ as e]: #异常处理
【代码块n】 #异常处理代码
[else:] #可选,如果没有引发异常会执⾏
处理语句
[finally:] #⽆论如何都要执⾏的语句
处理语句
【后续语句】
执⾏流程:
1、⾸先执⾏try中【代码块A】,如果出现异常,⽴即终⽌代码执⾏,转⽽到except块中进⾏异常处理
2、异常处理except模块可以多个,从上往下匹配,如果能够匹配成功,⽴即执⾏相应的异常处理代码块,执⾏完毕后,不在往下匹配,转到3执⾏
3、执⾏异常处理完毕后,如果有finally字句则执⾏finally字句,如果没有则执⾏【后续语句】
4、如果匹配不到异常,有finally则执⾏finally,然后则抛出错误,终⽌程序执⾏。
5、如果没有异常,如果有else字句则执⾏else字句,执⾏完else后,有finally字句则执⾏,没有则执⾏【后续语句】
注意事项:
except匹配顺序从上到下
except语句书写要求:精确的类型往前放,模糊的,不精确的往后放
except不带任何类型,则匹配所有类型异常,应该放到最后,吞掉异常
可以将多种异常⽤元组的⽅式(异常类型1,异常类型2…异常类型n)书写,简化代码
except字句中e,是⼀个对象,打印它,会显示异常信息描述
try-except也可以捕获⽅法或函数中抛出的异常
所有异常类型都继承⾃BaseException,使⽤BaseException可以将异常⼀⽹打尽
finally字句中可以进⾏⼀些清理⼯作,⽐如关闭⽂件,数据库等⼯作
1.3 抛出异常
⼿动抛出⼀个指定类型的异常,⽆论是哪种异常类都可以带⼀个字符串参数,对异常进⾏描述。
- raise不带参数会把错误原样抛出
try:
raise ZeroDivisionError('除0错误')
# raise ZeroDivisionError #如果不想获取错误信息,可以不带参数
except ZeroDivisionError as e:
print(e) #除0错误
1.4 异常嵌套
在try块和excep块中还可以分别再嵌套try-except块
1.5 assert断⾔
语法:assert 条件 [,异常描述字符串]
执⾏流程:如果条件为假,则抛出AssertionError,条件为真,就当assert不存在
作⽤:对于可能出问题的代码,加上断⾔,⽅便问题排查
print('start')
num = int(input('请输⼊⼀个1~9的整数:'))
assert 0 <num <=9,'num不在1~9'
print('end')
1.6 ⾃定义异常类
如果系统异常类型满⾜不了业务需求,那么可以⾃⼰定义异常类来处理。
- ⾃⼰定义的异常类必须继承BaseException或Exception
- 步骤:
- 在⾃定义异常类的构造函数中,调⽤⽗类构造函数
- 重写__str__ ⽅法输出异常信息
- 编写异常处理⽅法处理异常
class CustomError(BaseException): #继承BaseException
def __init__(self,msg):
super().__init__() #调⽤⽗类初始化
self.msg = msg
#重写__str__,输出异常信息
def __str__(self):
return self.msg
#3.⾃定义异常处理⽅法
def handle_exception(self):
print('异常处理')
try:
raise CustomError('⾃定义异常')
except CustomError as e:
print(e)
内建异常类的层次
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
作业
# 初级
# 1.利利⽤用封装和继承的特性完成如下操作:
# ⼩小学⽣生:
# 属性:姓名、学号、年年龄、性别
# ⾏行行为:
# 学习
# 打架
# 中学⽣生:
# 属性:姓名、学号、年年龄、性别
# ⾏行行为:
# 学习
# 谈恋爱
# ⼤大学⽣生:
# 属性: 姓名、学号、年年龄、性别
# ⾏行行为:
# 学习
# 打游戏
# 测试类中:
# 创建⼩小学⽣生对象
# 调⽤用学习的⽅方法
# 打印内容为: xx 学习的内容为:语⽂文 数学 英语
# 创建中学⽣生对象
# 调⽤用学习的⽅方法
# 打印内容为:xx 学习的内容为:语数外 ⽣生物化 史地政
# 创建⼤大学⽣生对象
# 调⽤用学习的⽅方法:
# 打印内容为: 逃课中。。。。。。
class Student():
def __init__(self,name,id,age,sex):
self.name=name
self.id=id
self.age=age
self.sex=sex
class Elementary_School_Students(Student):
def study(self):
print('{}学习的内容为:语文 数学 英语'.format(self.name))
def fight(self):
pass
class Middle_School_Students(Student):
def study(self):
print('{}学习的内容为:语数外 生物化 史地政'.format(self.name))
def fall_in_love(self):
pass
class Undergraduate(Student):
def study(self):
print('逃课中。。。。。。')
def paly_the_game(self):
pass
ess=Elementary_School_Students('小美','016',8,'女')
ess.study() # 小美学习的内容为:语文 数学 英语
mss=Middle_School_Students('晴子','038',15,'女')
mss.study() # 晴子学习的内容为:语数外 生物化 史地政
un=Undergraduate('程龙','096',20,'男')
un.study() # 逃课中。。。。。。
# 2.主人杨夫人向客人 李小姐介绍自己家的宠物狗和宠物猫
# 宠物狗:
# 昵称是:贝贝
# 年年龄是:2
# 性别:雌
# 会两条腿行走的才艺
# 宠物猫
# 昵称是:花花
# 年年龄是 1
# 性别是:雄
# 会装死的才艺
class Pet():
def __init__(self,nickname,age,sex):
self.nickname=nickname
self.age=age
self.sex=sex
class Cat(Pet):
def show(self):
print('会装死的才艺')
class Dog(Pet):
def show(self):
print('会两条腿行走的才艺')
c=Cat('花花',1,'雄')
c.show() # 会装死的才艺
d=Dog('贝贝',2,'雌')
d.show() # 会两条腿行走的才艺
来源:CSDN
作者:weixin_46149037
链接:https://blog.csdn.net/weixin_46149037/article/details/104776201