学习python的第九天(异常处理)

异常概述
异常: 不正常
程序在执行过程中发生了不可预知的问题.
导致程序崩溃

NameError
TypeError
ValueError
AttribitueError
SyntaxError
IndexError

改- index()

1. 异常的基本格式
try:
可能会出现异常问题的代码
except Exception as e:
当出现异常时,解决异常的代码
else:
当没有出现异常时,正常执行的代码
finally:
无论是否出现异常,都会执行这里的代码

语法糖

with open('a.txt','r') as f:
	f.read()

 1. 简单处理


# class 语法错误 (Exception)
#
#    class 简单语法错误 (语法错误)
#         没有缩进
#         使用全角符号
#
#     高级语法错误
#         逻辑性错误

 **2.使用 try-except 进行基本的异常处理**
 
s = 'Hello'
try:
    # 这句代码会发生异常
    print(s.index('O'))
# except ValueError:
except Exception:
    print('查找的子串不存在')

# 使用Try 来尝试执行 后面语句 块中的代码 ,如果代码 发生异常问题
# 那么异常信息就会被 except 捕捉到,可以在 except 后面进行异常处理
# 如果代码 没有异常,那么程序就正常运行,不会执行except 后的代码


print('over')


2. 异常的传递

当代码出现了很层级的调用时,在其中发生了异常,如果没有处理这个异常,这个异常会自动向上抛出
如果上层也没有处理,那么再继续向上抛出,直到抛到解释器,解释器默认处理异常的方式就是中断程序,
将异常信息显示控制台上

异常的传递
在发生异常时,异常的发生点可能在很深的函数调用过程中,这时如果不处理异常的话,异常会被一层一层的抛出
如果谁都没有处理,最终抛给解释器,解释是没办法处理异常,解释会将异常信息显示到终端

'''
异常的传递
'''

def func_a():
    print('Func a run ...')
    func_b()


def func_b():
    print("Func b run ...")

    try:
        func_c()
    except Exception:
        print('你的除数为0了')


def func_c():
    print('Func c run ...')
    # try:
    #     print(1 / 0)
    # except Exception:
    #     print('你的除数为0了')

    print(1 / 0)



func_a()

6. 异常处理

语法:
	try:
		可能出现异常的代码
	except Exception:
		当异常发生时,处理异常的代码

7. 多个异常的处理
将多个异常通过圆括号包裹成一个元组

语法:
	try:
		可能出现异常的代码
	except (异常1,异常2,...):
		当异常发生时,处理异常的代码

7-1: 异常别名-获取异常信息
语法:
try:
可能出现异常的代码
except (Exception,… )as e:
print(e)
当异常发生时,处理异常的代码

'''
注意:同时捕捉多个异常,但是同一时刻只能有一个异常发生
'''

try:
    # n = 1
    n / 0
# except (ZeroDivisionError,NameError) as e:
# except Exception as e:
except :
    print('出现异常了')

8. else:(可选的,理解)
在异常处理时,当没有异常发生的情况后,需要执行的代码,放到 else 语句块
9. finally:(可选的,掌握)
无论异常是否发生,都会执行这个语句块里的内容

应用:
一般应用在资源需要关闭资源的场景上
比如:文件的关闭,网络连接的关闭,数据库的关闭

'''
异常处理子句,else 用来处理没有异常的的情况
'''


try:
    f = None
    f = open('b.txt','r')
except Exception as e:
    print('要打开的文件不存在')
    print(e)
else:
    # 对文件的读取操作
    print('else 是当没有出现异常时,执行的else语句 块')
    print(f.read())
finally:
    # 不管是否出现异常,都要执行这个语句块
    # 一般这个模块中,主要写的内容 是资料关闭或回收
    # 比如,文件的关闭,网络连接的关闭,数据库的关闭
    print('无论是否出现异常,都会执行finally语句 块')
    if f != None:
        f.close()



with open('a.txt','r') as f:
    print(f.read())

11. 自定义异常

格式:
class 异常名Error(Exception):
	def __init__(self,msg=''):
		self.__msg = msg

	def __str__(self):
		return self.__msg



class CustomError(Exception):
	pass
'''自定义异常

格式 :
class 异常名Error(Exception):
    pass
'''

# 定义一个用来判断当前手机号是否有非法字符的异常
class PhoneNumberNotDigitError(Exception):
    pass


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


    def __str__(self):
        return self.__msg



# 定义一个函数,用来获取一个电话号码
def get_phone_number():
    pn = input('请输入一个11位的手机号:')
    if pn.isdigit() == False:
        # 抛出自定义的异常
        raise PhoneNumberNotDigitError()
    elif len(pn) != 11:
        raise PhoneNumberLengthError('手机号位数不正确')

    return '输入的手机号是合法的:' + pn

12. 自定义异常的抛出
raise 异常对象

raise 类名
raise 类名()
from p_16自定义异常 import *


try:
   num =  get_phone_number()
except (PhoneNumberLengthError, PhoneNumberNotDigitError) as e:
    print(e)
else:
    print(num)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值