python的异常处理
python程序中的错误可以被分为两大类:语法错误和逻辑错误
1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正)
#语法错误示范一 if #语法错误示范二 def test: pass #语法错误示范三 print(haha 语法错误
2.逻辑错误(逻辑错误)
#用户输入不完整(比如输入为空)或者输入非法(输入不是数字) num=input(">>: ") int(num) #无法完成计算 res1=1/0 res2=1+'str' 逻辑错误
程序一旦发生错误,就从错误的位置停下来,不继续执行后面的结果,解决办法,try except语句
以以下代码为例:
ret=int(input('请输入数字:')) print('*'*ret)
当只有输入为数字的时候,才能显示出结果,那么如果输入字母a,则
D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/练习.py 请输入数字:a Traceback (most recent call last): File "F:/python/python学习/人工智能/第一阶段day2/练习.py", line 1, in <module> ret=int(input('请输入数字:')) ValueError: invalid literal for int() with base 10: 'a' Process finished with exit code 1
利用try except语句对这段异常进行处理:常见结构
try是我们需要处理的代码
except后面跟一个错误类型,当代码发生错误类型符合的时候,就会执行except中的代码
try: ret=int(input('请输入数字:')) print('*'*ret) except ValueError: print('您输入的数字有误,请重新输入') #当输入h的时候,结果为 D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/练习.py 请输入数字:h 您输入的数字有误,请重新输入 Process finished with exit code 0
第二个问题:except可以有多个嘛?
结果是肯定的。也就是说except支持多分枝
比如,这是一个IndexError
[][3] D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/练习.py Traceback (most recent call last): File "F:/python/python学习/人工智能/第一阶段day2/练习.py", line 1, in <module> [][3] IndexError: list index out of range Process finished with exit code 1
那么
try: [][3] ret=int(input('请输入数字:')) print('*'*ret) except ValueError: print('您输入的数字有误,请重新输入') except IndexError: print('超出列表的最大长度') D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/练习.py 超出列表的最大长度 Process finished with exit code 0 也就是说利用try except可以同时处理多个错误
第三个问题:现在每次在使用的时候都需要输入ValueError、IndexError等相应的错误,可否有一种万能的错误类型:答案是肯定的,Exception
try: print('000') [][3] print('111') 1/0 print('222') name print('333') 2+'3' print('444') {}['k'] print('555') ret=int(input('请输入数字:')) print('*'*ret) except Exception: print('程序出现错误,请检查')
在每个可能出现的错误之前写上print('数字'),那么如果打印出相应的数字,表示代码执行到这里出现错误。通过这种方法可以逐句检查代码
虽然有了万能异常Exception,但是仍然需要特定的错误类型。即需要把能够预测到的问题单独处理,单独处理的所有内容都应该写在万能异常之前。这样能够直接判断是什么错误。
try: # print('000') # [][3] # print('111') # 1/0 # print('222') # name # print('333') # 2+'3' # print('444') # {}['k'] # print('555') ret=int(input('请输入数字:')) print('*'*ret) except ValueError: print('请输入正确的数字') except Exception: print('程序出现错误,请检查') else:#当代码中没有错误的时候,代码被直接执行,且执行else语句 print('代码中没有错误') D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/练习.py 请输入数字:5 ***** 代码中没有错误 Process finished with exit code 0
finally
def func(): try: f=open('file','w') return True except: return False finally:#由于在程序结束以后必须关闭文件,那么这个关闭写在try里面还是except里面都不合适,所以写在最后,无论程序是返回True或者是False都会执行finally这句话 print('执行了finally了') f.close() print(func()) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/练习.py 执行了finally了 True Process finished with exit code 0
finally和return相遇的时候,依然会执行。主要在函数中做异常处理。
不管是否异常,主要做些收尾的工作。
注意:try except虽然功能强大,但是并不适合对大段代码操作。所以在写代码的过程中首先自己应该首先应该排查出基本的错误。
try: ret=int(input('请输入数字:')) print('*'*ret) except Exception as error:#注意在使用Exception的时候需要加上一个as,这样即使出现错误,也能够知晓错误的类型 print('你错了',error)
python中常见的异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 常用异常
还有以下
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError
更多异常