如何让程序更稳健——异常处理

异常是指程序运行时引发的错误, 引发错误的方式有很多,例如,除0、下标越界、文件不存在、网络异常、类型错误等等。 出现错误将会导致程序终止 。如果能合理的使用异常处理结构,对程序可能出现的异常进行处理,将python晦涩难懂的错误提示转化为对用户更加友好、更加清晰明了的提示,就能使得程序更加健壮,具有更强的容错性 。

python 异常类

python 中所有的异常基类 是baseException, 其他的所有的异常类都是从这继承的子类。
主要的异常类如下:

baseException 所有异常基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
GeneratorExit 生成器(generator)发生异常来通知退出
Exception 常规错误
Warning 警告基类

python 异常处理结构

try except

异常处理结构最常见的也是最基本的是try except 结构,try 之后的代码块是可能出现异常的语句, except 子句用来捕捉相应的异常。
如果没有捕捉到异常, 则继续往下执行; 如果出现异常被except 捕获, 则执行except 块; 如果出现异常没有被捕获,则向外层抛出。
结构如下:

trytryexcept Exception[as reason]: 
    except

例如以下要求用户输入整数的的程序:

while 1 : 
    try : 
        x = int(input('please input a number'))
        break 
    except ValueError: 
        print('this is not a valid number.Try again')
# 运行
please input a number: 'a'
this is not a valid number.Try again

please input a number: 1.5 
this is not a valid number.Try again

please input a number:  1
try except else

另一种常用的异常处理结构是try except else , 和上一个结构的区别在于: 如果try 语句没有触发异常, 则执行else 语句块, 若抛出异常则不执行。

while 1 : 
    try : 
        x = int(input('please input a integer:'))
    except ValueError: 
        print('this is not a valid number.Try again')
    else:
        print('You\'ve successfully entered an integer')
        break 
#  运行 
please input a integer: 1 
You've successfully entered an integer
try 结构带有多个except

同一段代码可能会抛出多个异常, 需要针对不同的异常做相应的处理, 多个except 块就支持多个异常捕捉处理, 多分支结构,一旦某个except捕获了异常,则后面剩余的except将不再执行。 (如果可能出现多个异常,而不要分别处理,可以将异常写在一个元组中)

while 1 : 
    try:
        x = input('请输入被除数:')  
        y = input('请输入除数:')
        z = float(x)/float(y)
    except ZeroDivisionError: 
        print('除数不能为0') 
    except ValueError: 
        print('被除数和除数应为数值类型')
    else : 
        print(x,'/',y,'=',z)
        break
#  运行 
请输入被除数:a 
请输入除数:b 
被除数和除数应为数值类型

请输入被除数:1 
请输入除数:2 
1  / 2  = 0.5
try except finally

另一种重要的异常处理结构是 try except finally , finally 子句中的语句块无论是否发生异常都会执行,常用来做一些清理工作。

try : 
    f = open('test.txt', 'r')
    line = f.readline()
    print(line)
finally: 
    f.close()

无论读取是否发生异常,一定能确保关闭该文件。

断言

断言语句的语法是 assert expression [, reason] 。 当判断表达式expression为真时,什么都不做, 如果为假,则抛出异常。
断言常常用来抛出自定义的异常, 然后和try except语句一起使用 ;

try: 
    x = float(input('请输入一个正数  :'))
    assert  x>0  
except AssertionError : 
    print('这不是正数')
# 运行
请输入一个正数  : -1 
这不是正数

以上就是python 异常类和异常处理结构了 。
参考文献:
1 董付国 ,Python程序设计 ,清华大学出版社
2 菜鸟笔记, python异常处理结构

猜你喜欢

转载自blog.csdn.net/weixin_43705953/article/details/109538843
今日推荐