第二十三天异常处理

独自空忆成欢 提交于 2020-03-10 19:51:33

异常处理


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()     # 会两条腿行走的才艺
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!