Python异常处理

1. 异常格式

异常处理格式(else和finally可省略)

try:
	path1(可能发送异常的部分)
except:
	path2
else:
	path3
finally:
	path4
如果没发送异常,执行path1, path3, path4
如果发送异常,执行异常之前的部分以及path2, path4

举例:

try:
    print('path 1')
    open('a.txt', 'r')  # 发送异常输出(open发送异常,没有a.txt文件)发送异常输出(open发送异常,没有a.txt文件)
    print('path 2')
except:
    print('path 3')
else:
    print('path 4')
finally:
    print('path 5')
'''
path 1
path 3
path 5
'''

try:
    print('path 1')
    #open('a.txt', 'r')
    print('path 2')
except:
    print('path 3')
else:
    print('path 4')
finally:
    print('path 5')
'''
path 1
path 2
path 4
path 5
'''

2. 异常类型

异常类型含义举例
NameError使用没有定义的变量
TypeError操作或函数应用于不适当类型的对象a = 1 + ‘b’
ValueError操作或函数的参数具有正确的类型但不合法int(‘ab’)
KeyError访问字典中不存在的键
ZeroDivisionError除数为0时触发a = 2 / 0
IOError读取不存在或无法访问的文件
ImportError导入不存在的模块或包
AttributeError访问的对象不存在的属性
KeyboardInterrupt用户中断程序执行时发生
SyntaxError语法错误异常
IndexError索引异常

:在使用异常类型捕获异常的时候,异常的类型需要和可能发送异常的类型对得上,不然还是会抛出异常

带异常类型的格式
当不知道错误类型时使用Exception代替所有错误类型

try:	
    print('可能出现异常的代码')
    f = open('a.txt', 'r')
except Exception as e:
    print('发生异常时执行')
    print(e)
else:
    print('当没有出现异常时执行')
    print(f.read())
finally:
    print('无论是否出现异常,都会执行')
    # 这个模块一般用于资料关闭或回收,如文件关闭,网络连接关闭,数据库关闭
    f.close()

单一异常处理格式

try:
	a = 1 / 0
except ZeroDivisionError:
	print('除数不能为0')

多个异常处理格式

try:
	path1
except TypeError as e:
	print(e)
except ValueError as e:
	print(e)
except:
	path4

多个异常合并处理格式

try:
	path1
except (TypeError, ValueError) as e:
	print(e)
except:
	path4

3. 自定义抛出异常类

下面自己自定义一个判断手机号位数是够合法的异常类,如果不合法,则抛出异常

# 自定义异常类
class PhoneNumberNotDigitError(Exception):
    def __init__(self, msg):
        self.__msg = msg

    def __str__(self):
        return self.__msg


# 定义一个用来判断手机号位数是否合法的异常类
class PhoneNumberLengthError(Exception):
    def __init__(self, msg):
        self.__msg = msg

    def __str__(self):
        return self.__msg


# 抛出异常
def get_phone_number():
    pn = input('请输入手机号')
    if pn.isdigit() == False:
        # 抛出异常
        raise PhoneNumberNotDigitError('手机号不合法')
    elif len(pn) != 11:
        raise PhoneNumberLengthError('手机号位数不对')

    print('输入的手机号合法')


# 捕获异常
try:
    num = get_phone_number()
except (PhoneNumberLengthError, PhoneNumberNotDigitError) as e:
    print(e)
else:
    print(num)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值