Python攻克之路-异常处理
异常处理
1. 功能:防止出错而导致整个程序运行不了,实际程序在后台捕获到
分析:try的代码优先执行,如果出借,python内部会作出处理,创建一个Exception类的一个对象e,e这个对象中封装了错误信息
try: #代码块,逻辑 pass except Exception as e: # 上述代码块出错后,自动执行当前块,通俗理解,如果上面操作不行,执行以下操作 i = 1
示例:用户输入数字可以正常转换,否则就默认打印1
[root@node2 class2]# cat try.py #!/usr/local/python3/bin/python3 while True: try: inp = input('enter a number: ') i = int(inp) except Exception as e: i = 1 print(e) print(i) [root@node2 class2]# python3 try.py enter a number: 2 enter a number: 4 enter a number: dk invalid literal for int() with base 10: 'dk' #e的错误信息
2.错误类型:每种错误都有一个对象来表示
In [1]: li=[11,22] In [2]: li[99] IndexError: list index out of range In [3]: int('dkd') ValueError: invalid literal for int() with base 10: 'dkd'
场景:把Exception转换成具体的错误类型才捕获,如果不是具体指定的错误类型,就直接是全部错误
分析:IndexError和ValueError只能捕获相对应的错误,而Exception是全部都可以捕获,而且它们都是Exception的子类
In [5]: try: ...: li = [11,22] ...: li[99] ...: except IndexError as e: #如果是IndexError就可以捕获到 ...: print(e) ...: list index out of range In [6]: try: ...: int('dkd') #替换后,不能正常捕获 ...: except IndexError as e: ...: print(e) ValueError: invalid literal for int() with base 10: 'dkd'
3. 日志使用
描述:程序出错写入日志时,把错误类型分类的写入到不同的文件中,把重要的错误分到主文件,其他的小错误分配到一个文件
实现:先写出具体的错误捕获类型,最后写一个Exception,也就是如果之前的可以捕获就直接输出,不能捕获交给Exception
4.主动触发异常
分析:Exception类加括号,表示创建对象,再把这个对象赋值给e,e就是错误的对象
In [7]: try: ...: raise Exception('failed') #主动触发异常 ...: except Exception as e: ...: print(e) ...: failed
使用场景:函数可以嵌套函数
分析:出现错误就需要记录日志,not result表示没有执行成功,就要在下面open file写入日志,如果操作日志的实现比较复杂,那么就会增加代码量,这是db操作的错误,实际在Index里还可以有其他的代码如下面的int操作,也可能会出现错误,也要在except后面打开日志文件写入异常,not result的结果有错误也要写入日志中,操作两次
优化:两个都使用except后面的写入日志的功能,在not result后直接raise,这样raise Exception('db handle error')中的db handle error就是错误信息,这样str_error就直接是这个db错误,同时调用写入日志的操作
def db(): #db是操作数据库,可能成功或者失败 return True #操作成功,false则失败,如果出错需要记录到异常中,而且把错误信息写入到日志中 def index(): try: r = input(">>") #也会有错误 int(r) try: result = db() #如果result是True表示成功,如果是false是失败,失败需要记录到日志 if not result: #打开文件,写入日志,有了raise,这个打开写入日志的操作就可以省略 raise Exception('db handle error') except Exception as e: #e是错误信息 str_error = str(e) #取得字符串的错误信息 print(str_error) # 记录日志,需要打开一个文件才写,如果不raise Exception就要重复做这个操作 index() #执行
5.自定义异常
描述:Exception捕获所有异常,IndexError继承它的异常,可以自定义编写一个类,让它继承Exception
[root@node2 class2]# cat error-handle.py #!/usr/local/python3/bin/python3 class newError(Exception): def __init__(self,msg): self.message = msg def __str__(self): return self.message obj = newError('xxx') print(obj) #默认调用str方法,把xxx值赋予message,返回message [root@node2 class2]# python3 error-handle.py xxx
设置异常
[root@node2 class2]# cat error-handle.py #!/usr/local/python3/bin/python3 class newError(Exception): def __init__(self,msg): self.message = msg def __str__(self): return self.message try: raise newError('i am wrong') #相当于执行了obj = newError('xxx'),创建对象,把对象赋值给e(相当于obj) except newError as e: #当于newError相关的异常就捕获 print(e) #执行e对象的__str__的方法,获取返回值 [root@node2 class2]# python3 error-handle.py i am wrong
6.断言:assert 条件
描述:如果条件成立,代码什么都不执行,继续向下执行,如果不成立,整个程序就要出错,最终目的是要使用程序就强制要满足某个条件,否则,并且可以捕获,但是一般不捕获
例子:假设软件只支持ios,不支持安卓,安装上了安卓,但是一操作马上报错
[root@node2 class2]# cat ass.py #!/usr/local/python3/bin/python3 print(23) assert 1==1 #条件成立就通过,不成立就报错 print(565) [root@node2 class2]# python3 ass.py 23 565 [root@node2 class2]# cat ass.py #!/usr/local/python3/bin/python3 print(23) assert 1==2 print(565) [root@node2 class2]# python3 ass.py 23 Traceback (most recent call last): File "ass.py", line 3, in <module> assert 1==2 AssertionError