赞
踩
Python有两种不同的错误:语法错误和异常。
语法错误SyntaxError/句法错误/解析错误:执行前编译器检测到的错误。语法错误也是一种异常,SyntaxError继承Exception。
异常Exception:执行时检测到的错误。
需求:出异常会直接导致程序崩溃/结束,需要一种机制可以对异常进行处理,让程序出现异常时可以继续执行,引出异常和异常处理机制。
解决方案:捕获异常,保证程序可以继续执行。
try:
num1 = 10
num2 = 0
res = num1 / num2
except Exception as e:
print(f"捕获异常{e}")
print("程序继续执行")
基类异常:BaseException
、Exception
具体异常
IndexError
:索引越界
KeyError
:现有键集合中找不到指定的隐射(字典)键时被引发
NameError
:当某个局部或全局名称未找到时将被引发,如使用没有定义的变量名
TypeError
:当一个操作或函数使用了类型不适当的对象时被引发
ValueError
:当操作或函数接收到具有正确类型但值不适合参数时被引发
print(int("123"))
print(int("hello")) # ValueError
ZeroDivisionError
:当除法或取余运算的第二个参数为零时将被引发
FileNotFoundError
:请求的文件或目录不存在
AttributeError
:属性引用或赋值失败
class A:
def hi(self):
pass
a = A()
print(a.name)
捕获异常
try:
可能出现异常的代码
except [异常 as 别名]: # 将捕获的异常类型用别名接收
发生异常时,对异常处理的代码 # 程序员可以通过别名获取异常的具体信息
[else:]
没有发生异常时,执行的代码
[finally:] # 如关闭连接、释放资源相关代码
不管有没有异常,都要执行的代码
可以有多个except语句,捕获不同的异常(进行不同的业务处理),如果发生异常,只会匹配一个except,建议把具体的异常写在前面,基类异常在后,当具体异常匹配不到时,会由基类异常进行匹配。一个except子句,也可以捕获不同的异常。
except (IndexError, ZeroDivisionError) as e:
print(f"出现了异常信息{e} 类型{type(e)}")
except Exception as e:
print(f"出现了异常Exception 异常信息->{e}")
raise
语句支持强制触发指定的异常
try:
raise ZeroDivisionError("主动触发ZeroDivisionError异常")
except ZeroDivisionError as e:
print(f"出现了异常ZeroDivisionError 异常信息->{e}")
介绍:如果异常发生,但没有捕获处理异常,该异常会传递给调用者处理。如果所有的调用者都没有处理,最终会由系统处理。
def f2():
print(10/0)
def f1():
try:
f2()
except Exception as e:
print(f"f1()捕获异常{e}")
程序可以通过创建新的异常类命名自己的异常,无论直接还是简洁的方式,异常都应从Exception类派生
异常类通常应当保持简单,它往往只提供一些属性,允许相应的异常处理程序提取有关错误的信息。
大多异常命名都以Error结尾,类似标准异常命名,不要使用内置异常名
class AgeError(Exception):
pass # Exception有构造器传入参数
while True:
try:
age = int(input("请输入年龄(18-120):"))
if not (18<=age<=120):
raise AgeError("年龄需要在18-120之间")
break # 正确的值不会抛出异常,会执行到该语句,否则继续执行while循环
except ValueError as e:
print("你输入的不是整数")
except AgeError as e:
print(e) #输出传参信息
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。