35-异常处理

异常处理
在程序运行过程中,总会遇到各种各样的问题和错误。有些错误是我们编写代码时自己造成的,比如语法错误、调用错误,甚至逻辑错误。还有一些错误,则是不可预料的错误,但是完全有可能发生的,比如文件不存在、磁盘空间不足、网络堵塞、系统错误等等。这些导致程序在运行过程中出现异常中断和退出的错误,我们统称为异常。大多数的异常都不会被程序处理,而是以错误信息的形式展现出来。
异常有很多种类型,Python内置了几十种常见的异常,就在builtins模块内,无需特别导入,直接就可使用。需要注意的是,所有的异常都是异常类,首字母是大写的!
10 * (1/0)
Traceback (most recent call last):
File “”, line 1, in ?
ZeroDivisionError: division by zero


4 + spam*3
Traceback (most recent call last):
File “”, line 1, in ?
NameError: name ‘spam’ is not defined

‘2’ + 2
Traceback (most recent call last):
File “”, line 1, in ?
TypeError: Can’t convert ‘int’ object to str implicitly

为了保证程序的正常运行,提高程序健壮性和可用性。我们应当尽量考虑全面,将可能出现的异常进行处理,而不是留在那里,任由其发生。
Python内置了一套try…except…finally(else)…的异常处理机制,来帮助我们进行异常处理。其基本语法是:
try:
pass
except Exception as ex:
pass

try…except…语句处理异常的工作机制如下:

首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。

try:
print(“发生异常之前的语句正常执行”)
print(1/0)
print(“发生异常之后的语句不会被执行”)
except ZeroDivisionError as e:
print(e)

结果:
发生异常之前的语句正常执行
division by zero

如果程序发生的异常不在你的捕获列表中,那么依然会抛出别的异常。

未捕获到异常,程序直接报错

s1 = ‘hello’
try:
int(s1)
except IndexError as ex: # 本例为非法值异常,而你只捕获索引异常
print(ex)

Traceback (most recent call last):
File “F:/Python/pycharm/201705/1.py”, line 5, in
int(s1)
ValueError: invalid literal for int() with base 10: ‘hello’

如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中
try:
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
print(“发生异常之后的语句不会被执行”)
except ValueError as e:
print(e)

except ZeroDivisionError as e:
print(“里层没有抓好,只能辛苦我外层了”)

文件读写异常处理
import time
try:
f = open(‘test.txt’)
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
pass

finally:
    f.close()
    print('关闭文件')

except Exception:
print(‘没有这个文件’)

可能包含多个except子句,分别来处理不同的特定的异常
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
print(“发生异常之后的语句不会被执行”)
except NameError as e:
print(e)
except ZeroDivisionError as e:
print(“我是第一个抓取到除零异常的”)


发生异常之前的语句正常执行
我是第一个抓取到除零异常的

捕获多个异常
try:
print(“发生异常之前的语句正常执行”)
print(1/0)
open(“xxx.txt”)
print(“发生异常之后的语句不会被执行”)
except (ZeroDivisionError,FileNotFoundError) as e:
print(e)

通用异常:Exception
在Python的异常中,有一个通用异常:Exception,它可以捕获任意异常。
s1 = ‘hello’
try:
int(s1)
except Exception as e:
print(‘错误’)
finally:
print(“finally被执行”)

主动抛出异常:raise
很多时候,我们需要主动抛出一个异常。Python内置了一个关键字raise,可以主动触发异常。

raise
Traceback (most recent call last):
File “<pyshell#0>”, line 1, in
raise
RuntimeError: No active exception to reraise

raise NameError(“kkk”)
Traceback (most recent call last):
File “<pyshell#1>”, line 1, in
raise NameError(“kkk”)
NameError: kkk

自定义异常类抛出
class ShortInputException(Exception):
def init(self,info):
self.info = info

def main():
try:
s = “ab”
if len(s) < 3:
raise ShortInputException(“长度不够”)
except ShortInputException as e:
print(e)
main()

自定义异常
Python内置了很多的异常类,并且这些类都是从BaseException类派生的。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值