一、异常种类
#异常:Python解释器在执行程序时,如果遇到一个错误,就称为一个异常
#抛出异常: 程序执行中止报错,称为抛出异常
#捕获异常:某些代码不能确认是否正常执行,可以来捕获异常
异常的种类:
Exception 所有异常的基类,包含所有错误类型
AttributeError 对象没有这个属性
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类);缩进错误,代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 对类型无效的操作
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
NotImplementedError 尚未实现的方法
StopIteration 迭代器没有更多的值
"""
二、异常捕获结构
"""
1.简单异常捕获
try:
尝试执行的可能存在异常的代码
except:
异常处理,如果发生异常,执行except的代码,except可以有0个或多个,如果有多个
"""
"比如在计算除法中出现为 0 的情况出现异常 "
try:
1/0
except ZeroDivisionError as e:
print(e.args)
"""
2.根据错误类型捕获异常
try:
尝试执行可能存在异常的代码
except 已知异常1:
异常处理
except(已知异常2,已知异常3):
异常处理
"""
"""
3.python内置模块.捕获未知错误
开发时没有提前预知的错误被称为未知错误
如果开发过程中,不论出现任何异常而导致程序终止,则可以使用捕获未知错误
语法:
try:
尝试执行可能存在异常的代码
except Exception as result: #Exception是python的异常类,包含所有的错误类型;result表示错误类型,使用print可以输出错误信息
print("出现的异常是%s" %result)
"""
"""
4.异常捕获的完整语法:
try:
尝试可能有异常的代码段
except 已知异常1:
异常处理
except (已知异常2,已知异常3):
异常处理
except Exception as result: #捕获未知异常
print("未知异常%s" %result)
else:
无异常时执行的代码段
finally:
无论是否有异常都会执行的代码段
"""
"""
6.主动抛出异常
除了程序中本来需要捕获的异常外,还可以根据应用需求主动抛出异常
python提供了 Exception 异常类,如果想主动抛出异常:
1.创建一个Exception类的异常对象:EX= Exception()
2.使用raise 抛出异常对象: raise Ex
"""
"主动抛出异常的例子"
def input_passworld():
userpwd= int(input("请输入一个密码:"))
if len(userpwd>=8 ): #如果密码大于等于8,返回密码
return userpwd
# 如果小于8,则抛出异常
EX= Exception("密码长度不够!!!") # 1.创建异常对象
raise EX # 2.抛出异常对象
try:
print(input_passworld()) # 在调用函数方捕获抛出的异常
except Exception as result:
print("异常信息%s" %result)
"""
7.异常的传递
异常向上传递,会一级一级传递到调用函数,直到主程序
* * * 在主程序中设置异常捕获机制,可以防止程序出错终止
"""
def demo1():
func1= input( input("请输入正确的整数"))
print("func1")
def demo2():
demo1()
# 主程序:
try:
print(demo2()) #在主程序中设置异常捕获机制,可以防止程序出错终止
except Exception as result:
print("捕获到的异常为%s" %result)
三、自定义异常
1. 定义一个异常类,继承Exception基类
2. 使用raise抛出异常类
"""
class MyException(Exception): #定义一个异常,继承 Exception异常基类
def __init__(self, msg):
self.message = msg
def __str__(self):
return self.message
try:
raise MyException('我的异常') #使用 raise 主动触发异常
except MyException as e:
print('异常信息:', e)
四、断言
什么是断言?
在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时 就崩溃,这时候就需要 assert 断言的帮助
python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。
可以理解 assert 断言语句为 raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
断言条件为真时,代码继续执行,负责抛出异常,这个异常通常不会去捕获他,我们设置一个断言目的就
是要求必须实现某个条件。assert True
格式: assert 表达式 #表达式为真,断言成功,不输出任何消息,程序继续执行;表达式为假,断言失败,程序报错终止
断言的应用场景:
1.断言能够帮助别人或未来的你理解代码,找出程序中逻辑不对的地方,
2.一方面,断言会醒你某个对象应该处于何种状态,
3.python内置模块.另一方面,如果某个时候断言为假,会抛出 AssertionError 异常,很有可能终止程序。
4.来测试表示式,其返回值为假,就会触发异常
"""
assert 1 == 1 #表达式为真,不输出信息
print('---------------')
#assert 1 == 2 #表达式为假,抛出异常
"""Traceback (most recent call last):
# File "Z:/python_project/day18/ddd/yichang.py", line 26, in <module>
# assert 1 == 2
#AssertionError"""
def foo(a):
assert a==2,Exception("不等于 2")
print("ok",a)
if __name__ == '__main__':
foo(2) #ok 2
foo(1) #AssertionError: 不等于 2