Python异常处理

文章目录

  • 异常格式
  • 异常类型
  • 自定义抛出异常类

异常格式

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

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

举例:

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

输出:发送异常输出(open发送异常,没有a.txt文件):

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

异常类型

异常类型 含义 举例
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

自定义抛出异常类

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

# 自定义异常类
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)

你可能感兴趣的:(Python,python,开发语言)