程序编译通过后,并不意味着运行时就能得到正确的结果,很可能由于编程时考虑不周所以运行时遇到一些特殊情况(如出发运算是除数为0、访问列表时下标越界、要打开的文件不存在等),结果出现中断程序正常运行的情况。这类导致程序中断运行的错误称为异常(Exception,又称为“例外”)
异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。
在一般情况下,在Python无法正常处理程序时就会发生一个异常。
当Python程序发生异常时需要捕获处理它,否则程序会中止执行。
像其他高级编程语言一样,Python定义了一歇异常类,配合一定的机制在Python中处理程序中的各种一场。这些累的基类都是BaseException
异常类 | 功能描述 |
---|---|
BaseException | 所有异常类的基类 |
Exception | 常见错误类的基类 |
AttributrError | 访问一个对象没有的属性 |
IndexError | 下标索引超出序列边界 |
IOError | 输入/输出异常 |
KeyError | 访问映射中不存在的键 |
TypeError | 类型错误,函数应用了错误类型的对象 |
NameError | 试图访问的变量名不存在 |
ImportError | 导入模块/对象失败 |
IndentationError | 缩进错误 |
RuntimeError | 一般运行时错误 |
SyntaxError | 语法错误 |
UnboundLocalError | 访问未初始化的本地变量 |
ValueError | 传入无效参数 |
在Python中,使用try-except-else-finally语句对程序中的异常进行处理
try:
语句块 #包含可能发生异常的语句
except 异常类型1[ as 错误描述]:
语句块 #异常处理语句块
...
except 异常类型n[ as 错误描述]:
语句块
except:
语句块 #默认异常处理语句块
[else:
语句块] #没有异常时执行的语句块
[finally:
语句块] #任何情况下都执行的语句块
try子句:包含可能抛出异常的语句块
except字句:负责处理抛出的异常,处理的尝试顺序与多个except子句的编写顺序一致。
当尝试发现第一个异常类型匹配的except子句时就执行其后的语句块。最后一个不指定异常类型的except子句匹配任何类型的异常
else子句:当try子句中的语句块没有发生任何异常时执行,可选
finally子句:无论是否有异常抛出,只要finally子句存在就会被最终执行,可选
try-except-else-finally语句执行情况分为以下两种
(1)try子句中的语句块没有发生异常,在执行完try子句中的语句块后,接着执行else子句中的语句块,最后执行finally子句中的语句块
(2)try子句中的语句块发生异常时发生异常的类型将和except子句的异常类匹配并执行其后的语句块,最后执行finally子句中的语句块
except子句、else子句和finally子句中的语句块可以为用户输出异常消息或提示信息。
异常消息可通过异常对象的message成员给出,也可以由用户根据要求给出。
list1=[2,1,3,4,7,11,18,29] # 卢卡斯数
try:
print(list1[8])
except IndexError as e:
print("列表索引超出范围!")
#列表索引超出范围!
#IndexError: list index out of range
至少他可以保证程序不跳出,并给出对应的提示,关键提示可以自己编辑,可以是任何支持的语言。
但有没有什么方法可以完全本地化错误提示呢?
Python异常和错误
排名首位的一篇文章,一片笔记,其中提到了异常是可以一直往上抛的,嘛~ 这个意义吗,玩转了参数传递和装饰器,就能很方便的本地化错误提示了吧!
l=[1,2,3]
def LocalException(func):
try:
func()
except IndexError as e:
print("列表索引超出范围!")
return func
@LocalException
def func():
l[4]
这里func执行的l[4]越界错误,抛给上一层,func - LocalException 这里try-except接收到了错误,并进行处理,只需要把常见的错误都写在LocalException,并存储起来,之后调用只需要import as @即可!
a=100
try:
b=a+"Python"
#TypeError: unsupported operand type(s) for +: 'int' and 'str'
except Exception as e:
print("异常类型:%s"%type(e))
print("异常信息:%s"%e)
#
异常类型:<class 'TypeError'>
异常信息:unsupported operand type(s) for +: 'int' and 'str'
不确定异常指在变成人员在编程时不确定引发异常的类型,因而使用通用异常类型处理
x,y=eval(input("请输入两个整数,用英文逗号隔开:"))
try:
z=x/y
print("z=",z)
except TypeError as el:
print("数据类型异常:",el)
except ZeroDivisionError:
print("除数为零异常!")
except:
print("程序运行异常")
else:
print("程序执行正确")
#
请输入两个整数,用英文逗号隔开:"a",1
数据类型异常: unsupported operand type(s) for /: 'str' and 'int'
eval(source, globals=None, locals=None, /)
python3中eval函数用法使用简介
eval是将字符串转化成其表示的表达式,例如上述例子,输入"a",1,即eval(’ “a”,1 ')即:x,y=“a”,1
s=input()
print("1:",end=" ")
print(repr(s))
print("2:",end=" ")
print(str(s))
print(