异常处理
Posted yangyufeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。
元类中的__new__方法
__new__方法用于新建类对象,通过type调用__new__可以用来创建一个空的对象
__new__与__init__的区别
作为一个类对象必须具备三个组成部分,所以调用type中的__new__来完成组装
得到这个类对象需要返回,以供__init__来使用
异常处理
什么是异常处理?
什么是异常? 与正常情况不同的就是异常,在程序执行过程中,出现错误导致代码无法执行完毕,就称之为异常
常见异常
1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异常;基本上是无法打开文件 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误 4 IndentationError 语法错误(的子类) ;代码没有正确对齐 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] 6 KeyError 试图访问字典里不存在的键 7 KeyboardInterrupt Ctrl+C被按下 8 NameError 使用一个还未被赋予对象的变量 9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) 10 TypeError 传入对象类型与要求的不符合 11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 12 导致你以为正在访问它 13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
组成异常的三部分:
1.追踪信息 2.异常类型 3.异常的值
如何排查错误:
1.定位错误发生的位置
(使用追踪信息
1.代码是自己写的,没有调用任何的内置模块与方法,那么错误发生位置一定在最后一行
2.如果代码调用内部模块与其他模块的方法:
1.是系统内置的模块 例如抛出位置object.py 不用去查看object类 它几乎不可能出错一定是你自己代码在调用时出了错误
2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
如果有很多追踪信息,找最后一行是自己写的代码的位置
2.查看异常类型 例如:IndexError
3.查看异常的值 例如: list index out of range
如果没有任何异常信息 但是程序就是不对 可以使用排除法
异常可以根据发生时间分为两类:
1.语法检测异常 (语法异常和缩进错误)
解释器在执行代码前会检测语法,检测通过才会执行,如果这个阶段出现异常,代码一行都不会执行
2.运行是异常
已经通过语法检测,在解析执行期间发生异常
异常处理语法:
语法1:
try: #可能发生错误的代码
except 异常类型: #当try 中发生错误时会执行expect中的代码 做一些补救措施
语法2
try:
except 异常类型:
except 异常类型:
except 异常类型:
语法3 #在一个except中可以有多个异常类型,用逗号隔开
try
except ():
语法4: #万能异常 尽量少用 程序即不报错 也不正常运行 无法定位错误位置
# 建议输出错误信息
try:
except Exception:
语法5: # +as 使用 通过给异常取别名获取异常的对象,对象中包含了错误信息
try:
except Exception as e:
#e 输出错误信息
print(e)
语法6: # 先捕获能够明确的异常类型,最后捕获万能异常
try:
except ZeroDivisionError:
except IndexError:
except Exception as e:
语法7
try:
except:
else
语法8
import io
finally #无论是否发生异常最后都会执行finally 中的代码
使用场景:
1 try: 2 print(‘start‘) 3 f = open(‘‘,‘rt‘,encoding=‘utf-8‘) 4 f.write(‘123456‘) 5 print(‘end‘) 6 except FileNotFoundError: 7 print(‘文件路径错误....‘) 8 except io.UnsipporatedOperation: 9 print(‘文件不能被写入...‘) 10 finally: 11 f.close() 12 print(f.close)
正确使用异常处理的步骤:
1 """ 2 1.如果能明确知道异常发生原因 就不要产生异常 使用if判断等方式 3 2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常 4 3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息 5 """
为什么要主动抛出异常?
1 #当写了一些功能,是提供给别人的,然而使用者不按照规则会用,就会导致程序出错,而我们无法帮助用户处理这个错误 2 #需要用raise 主动抛出异常 后面跟任意Exception的子类
自定义异常类
1 class MuException(Exception): 2 pass
断言: assert
断定 很确定某个条件是成立的
有一段代码要执行必须要保证某个条件是成立的
简化代码,后面必须跟bool表达式
直抛出异常AssertionError 局限性在于 异常类型固定,而且不能指定异常信息
以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段