python - 异常处理

目录

1.  错误与异常

1.1 什么是错误

1.2 什么是异常

1.3 回溯信息

2. 常见异常类

2.1 NameError :

2.2 IndexError

2.3 ZeroDirvisionError

2.4 AttributeError 属性异常

2.5 ValueError

2.6 AssertionError

3.  异常处理

3.1  单个异常处理

3.2  多个异常处理

 3.3  else 结构

3.4  finally 结构

3.5  手动抛出异常 raise

3.6 关于性能


1.  错误与异常

1.1 什么是错误

• 语法错误(大小写拼写错误、括号不匹配等...)=> 不能正常执行

• 逻辑错误(程序运行正常,只是最后结果不符合预期)

################################################

1.2 什么是异常

• 程序运行过程中,出现的意料之外的错误

• 如:打开的文件不存在、被除数为0、操作的数据类型不对、存储错误,互联网请求错

################################################

1.3 回溯信息

• 当程序运行时,发生了未处理的异常,Python就将终止执行程序,并以堆栈回溯(Traceback,也

称向后追踪)的形式显示异常发生的上下文。

• 回溯信息告诉我们应该去哪里寻找问题的根源,对解决问题非常有帮助。

 ################################################

2. 常见异常类

 ################################################

2.1 NameError :




print(abc)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
NameError: name 'abc' is not defined

################################################ 

2.2 IndexError

a=[1,2,3]
print(a[5])
Traceback (most recent call last):
File <stdin>, line 1, in <module>
IndexError: list index out of range

################################################ 

2.3 ZeroDirvisionError

print(1/0)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
ZeroDivisionError: division by zero

################################################ 

2.4 AttributeError 属性异常




a = xxx
a.yy()
Traceback (most recent call last):
File <stdin>, line 1, in <module>
AttributeError: 'str' object has no attribute 'yy'

################################################ 

2.5 ValueError

int(abc)
Traceback (most recent call last):
File <stdin>, line 1, in <module>
ValueError: invalid literal for int() with base 10: 'abc'

################################################ 

2.6 AssertionError

断言错误

常常用在测试上面


a=4
b=3
assert a<b
Traceback (most recent call last):
File <stdin>, line 1, in <module>
AssertionError

################################################ 

3.  异常处理

异常处理

在代码被解释执行的过程中可能会抛出异常。

那么也就是说,可能会发生,可能不会发生。对于这么不可预测的异常状态如何处理?

1:即使程序出错,也不想让程序终止

2:如果出错了,需要特殊处理

异常处理机制 try...except...Python异常处理

 简单的异常处理的格式

 执行顺序:

• 正常执行:

try -> 执行代码 -> 结束

• 遇到异常:

################################################

3.1  单个异常处理

try -> 遇到异常 -> 跳到excep -> 结束

# 如果捕获到异常就处理except里的内容
try:
    print("打开文件aa")
    fp = open("aa")
except:
    print("文件未找到")
print("end......")

 ################################################

3.2  多个异常处理



指定了捕获异常,就只会捕获这一种异常
except 捕获的错误与触发的错误不一致,程序就捕获不到,异常会照常抛出
可以指定多个异常
匹配到第一个就退出

父类异常 子类异常
老师(父类)  --高中老师,初中老师
Exception --FileNotFoundError
Exception 是大多数异常类的父类
如果有多个异常捕获第一个异常就会抛出
异常发生了,那try监控的这段代码后面就不会执行了
所以可以将父类异常放到最后

try:
    print("打开文件aa")
    fp = open("aa")
    print(abc)
except Exception as e:
    print(f'Exception {e}')
except ZeroDivisionError as ze:
    print("文件未找到")
except FileNotFoundError as fe:
    print("文件不存在")
print("end......")

E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
打开文件aa
Exception [Errno 2] No such file or directory: 'aa'
end......

Process finished with exit code 0

 ################################################

 3.3  else 结构

没有任何异常发生就会执行else语句

else结构
没有任何异常发生的情况就会执行else的语句
try:
    print("else....")
except:
    print("error")
else:
    print("else end...")

E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
else....
else end...

Process finished with exit code 0

 ################################################

3.4  finally 结构

在函数中,需要注意在try/except/finally使用return
在finally中使用return,异常无法回溯
在函数中的try/except语句使用return后,仍然会执行finally中的内容
finally => 正常或异常都执行
return => 直接退出函数,返回值给主程序
# finally 结构,不管异常有没有被捕获都执行
try:
    print("finally test")
    a = 1/0
except ZeroDivisionError:
    print("error")
else:
    print("test else...")
finally:
    print("finally test end...")

E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
finally test
error
finally test end...

Process finished with exit code 0
#在函数里面即使return退出了还是会执行finally结构
def finally_func():
    try:
        print("try test")
        return "abc"
    except:
        print("error")
    finally:
        print("finally ...")

a= finally_func()
print(a)

 ################################################

3.5  手动抛出异常 raise

几点建议
不建议使用异常来代替常规的检查,如if...else判断
避免过多依赖于异常处理机制
在必要的时候,可以手动引发异常(raise)=> 函数或方法
# 手动抛出异常
# raise 异常类
# raise 异常类 (“异常信息”)
raise ZeroDivisionError("异常信息")
raise IndexError("index error")

try:
    grades = int(input("请输入一个整数:"))
    if grades < 0 or grades > 100:
        raise IndexError("数字不在1-100之间")
except IndexError as fe:
    print(fe)
except ValueError as fi:
    print(fi)
else:
    print(grades)

E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
请输入一个整数:200
数字不在1-100之间

Process finished with exit code 0

E:\python\python3.9.1\python.exe E:/tlbb/2022-04-09-异常处理/异常处理.py
请输入一个整数:2.1
invalid literal for int() with base 10: '2.1'

Process finished with exit code 0

 ################################################

3.6 关于性能

try里面套循环要比for循环里面套try运行时间短

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值