python - 啃书 第十章 异常处理和单元测试

异常类和异常处理

异常和异常类

程序编译通过后,并不意味着运行时就能得到正确的结果,很可能由于编程时考虑不周所以运行时遇到一些特殊情况(如出发运算是除数为0、访问列表时下标越界、要打开的文件不存在等),结果出现中断程序正常运行的情况。这类导致程序中断运行的错误称为异常(Exception,又称为“例外”)

异常是一个事件,该事件会在程序执行过程中发生,影响程序的正常执行。
在一般情况下,在Python无法正常处理程序时就会发生一个异常。
当Python程序发生异常时需要捕获处理它,否则程序会中止执行。

像其他高级编程语言一样,Python定义了一歇异常类,配合一定的机制在Python中处理程序中的各种一场。这些累的基类都是BaseException

异常类 功能描述
BaseException 所有异常类的基类
Exception 常见错误类的基类
AttributrError 访问一个对象没有的属性
IndexError 下标索引超出序列边界
IOError 输入/输出异常
KeyError 访问映射中不存在的键
TypeError 类型错误,函数应用了错误类型的对象
NameError 试图访问的变量名不存在
ImportError 导入模块/对象失败
IndentationError 缩进错误
RuntimeError 一般运行时错误
SyntaxError 语法错误
UnboundLocalError 访问未初始化的本地变量
ValueError 传入无效参数

异常处理

1、异常处理格式

在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成员给出,也可以由用户根据要求给出。

使用try-except语句处理列表索引范围异常:except IndexError as e
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 @即可!

使用try-except语句的默认except子句处理不确定异常:except Exception as e

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(

你可能感兴趣的:(啃书,Python,程序设计,从入门到实战应用)