python-异常处理
错误与异常
Error错误:
- 语法错误,在编译代码阶段就能检测出来;
print(aaa
if :
- 逻辑错误,在执行过程中显现出来。
num=input("请输入数字:")
get_sum=1+int(num) #当输入的是一个字符串aaa时,int("aaa")就会发生逻辑错误
Exception异常:
在执行代码的过程发生的中断程序的事件,一个异常标识一种错误。例如:
print("aaa")
print(name)
print("end")
输出: 在执行到第二个print的时候name没有定义,报错。
常用异常:
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
异常处理
概念
什么是异常处理?
python解释器检测到错误,触发异常(也允许程序员自己触发异常)
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理。
语法
异常处理的语法:
- if判断
# num=input("请输入数字:")
# if num.isdigit():
# get_sum=1+int(num)
# print(get_sum)
# else:
# print("输入有误")
- python特定的异常处理语法
1)基础的 try except
num=input("请输入数字:")
try:
get_sum=1+int(num)
print(get_sum)
except ValueError:
print("输入有误") #只有触发ValueError异常时,才会走到这里
2)多分支异常
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
3)万能异常Exception
可以匹配绝大多数情况的异常,最好打印出异常的错误说明。
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
4)多分支+万能异常
将能预料到的异常类型放到分支里面处理,剩下的情况再用万能异常匹配处理。
dic={"11":"aa","22":"2"}
try:
print(dic["key"])
except NameError:
print("NameError错误")
except KeyError:
print("KeyError错误")
except ValueError:
print("ValueError错误")
except Exception as e:
print(e)
5)else的使用
try中的代码正常执行,没有异常的时候会执行else中的代码。try except else固定连用
dic={"11":"aa","22":"2"}
try:
print(dic["11"])
except KeyError:
print("KeyError错误")
except ValueError:
print("ValueError错误")
else:
print("good")
6)finally的使用
无论是否有异常,或突然退出,都会执行finally中的内容,可用于资源回收
def get_file():
try:
f = open("test.log")
# exit()
return f.read() #return或者exit()都会执行finally
except Exception as e:
pass
finally:
print("执行finally")
f.close()
get_file()
7)主动抛异常 raise
raise ValueError #主动抛出ValueError的异常
s1 = 'hello'
try:
int(s1)
except Exception:
print("value类型错误")
raise #抛出匹配到此分支的错误类型
8)自定义异常
一般代码面向的对象是程序员,而不是用户时,才有可能自定义异常。
class MydefError(Exception):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
# raise MydefError("我说它错了,它就错了")
try:
raise MydefError("我说它错了,它就错了")
except MydefError as e:
print(e)
9)断言 assert
用法:assert
只有满足assert True时,下面的程序才会执行。通常用于整个大程序的逻辑判断,符合则继续执行,不符合,则不执行后续全部代码。
print("start")
assert True
# assert False
print("aaa")
总结:python中异常处理常用语法:
try except
try except else
try except else finally
try/except/finally
try/finally
traceback 捕获异常堆栈信息
在一个程序运行中往往涉及很多文件,我们使用以下代码,虽然能看到报错内容,但不能定位到文件代码位置:
需要使用 traceback 模块捕获异常堆栈信息,定位到程序中的具体文件与代码行数,它还会展示报错信息
import traceback
try:
int('scb')
except Exception as e:
# print(e)
print(traceback.format_exc())
运行效果:
PS D:\学习\python_script\homework\cmdb\autoclient> python .\test.py
Traceback (most recent call last):
File ".\test.py", line 4, in <module>
int('scb')
ValueError: invalid literal for int() with base 10: 'scb'