• [Python] 捕获异常


    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样就可以知道是否有错,以及出错的原因

    在使用Python语言进行编程运行时,如果Python解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常

    Python脚本发生异常时,我们需要捕获并处理它,否则程序将会终止执行,因此本文接下来主要讲解三种常见的捕获异常语句,方便日后的学习复盘

    1. try...except语句

    语法结构

    1. try:
    2. <可能抛出异常的语句>
    3. except:
    4. <处理异常>

    try代码块是执行过程中可能会抛出异常的语句

    except代码块用于进行异常处理

    当try代码块中的语句抛出异常时,except中的代码块将会被执行 

    实例

    1. try:
    2. num = int(input('请输入一个整数:'))
    3. print(num * 10)
    4. except:
    5. print('提示:请输入整数!')

    输入数字12,程序会正常运行,输出结果120

    输入字母ABC,程序会抛出异常,输出结果'提示:请输入整数!'

    2.try...except...else语句

    语法结构

    1. try:
    2. <可能抛出异常的语句>
    3. except:
    4. <处理异常>
    5. else:
    6. <语句>

    try...except语句后可以添加else语句,使用else语句时,必须将它放在except语句之后和try语句之后

    try语句中的代码块没有发生任何异常时,else语句中的代码块将被执行(当没有错误发生时,会自动执行else语句)

    实例

    例1 

    1. try:
    2. num = int(input('请输入:'))
    3. except:
    4. print('输入的值不是整数')
    5. else:
    6. print('输入的值是整数',num)

    输入数字12,程序会正常运行,输出结果输入的值是整数12

    输入数字2.5,程序会抛出异常,输出结果输入的值不是整数

    输入字母ABC,程序会抛出异常,输出结果输入的值不是整数 

    例2

    1. try:
    2. print('try...')
    3. res = 10 / int('2')
    4. print('result:', res)
    5. except ValueError as e:
    6. print('ValueError:', e)
    7. else:
    8. print('no error!')
    9. finally:
    10. print('finally...')
    11. print('END')

    上述代码输出结果如下所示

    try...
    result: 5.0
    no error!
    finally...
    END

    例3

    1. while True:
    2. try:
    3. x = int(input('Enter the first number:'))
    4. y = int(input('Enter the second number:'))
    5. value = x / y
    6. print('x/y is',value)
    7. except:
    8. print('Invalid input.Please try again!!')
    9. else:
    10. break

    上述代码中仅当没有引发异常时,才会跳出循环(由else子句中的break语句实现),换而言之只要出现错误,程序就会要求用户提供新的输入

    Enter the first number:1

    Enter the second number:0
    Invalid input.Please try again!!

    Enter the first number:1

    Enter the second number:a
    Invalid input.Please try again!!

    Enter the first number:1

    Enter the second number:2
    x/y is 0.5

    3. try...except...finally语句

    语法结构

    1. try:
    2. <可能抛出异常的语句>
    3. except:
    4. <处理异常>
    5. finally:
    6. <语句>

    无论程序有无异常发生,finally代码块都会被执行 

    当我们认为某些代码可能会出错时,就可以用try来运行这段代码,如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此执行完毕

    实例

    例1

    1. try:
    2. print('try...')
    3. res = 10 / 0
    4. print('result:', res)
    5. except ZeroDivisionError as e:
    6. print('except:', e)
    7. finally:
    8. print('finally...')
    9. print('END')

    上述代码输出结果如下所示

    try...
    except: division by zero
    finally...
    END

    上面的代码在计算10/0时会产生一个除法运算错误

    从输出结果可以看到,当错误发生时,后续语句print('result:', res)不会被执行,except由于捕获到ZeroDivisionError,因此执行print('except:', e),紧接着执行finally语句块中的代码print('finally...'),最后程序继续按照流程往下走,执行print('END')

    例2 

    1. try:
    2. print('try...')
    3. res = 10 / 2
    4. print('result:', res)
    5. except ZeroDivisionError as e:
    6. print('except:', e)
    7. finally:
    8. print('finally...')
    9. print('END')

    上述代码输出结果如下所示

    try...
    result: 5.0
    finally...
    END

    由于没有错误发生,所以except语句块不会被执行,但是如果有finally语句块,则一定会被执行(可以没有finally语句)

    例3

    可以用多个except语句来捕获不同类型的错误

    1. try:
    2. print('try...')
    3. res = 10 / int('abc')
    4. print('result:', res)
    5. except ValueError as e:
    6. print('ValueError:', e)
    7. except ZeroDivisionError as e:
    8. print('ZeroDivisionError:', e)
    9. finally:
    10. print('finally...')
    11. print('END')

    上述代码输出结果如下所示

    try...
    ValueError: invalid literal for int() with base 10: 'abc'
    finally...
    END 

    使用try...except...finally捕获错误还有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用bar(),bar()调用foo(),结果foo()出错了,这时只要main()捕获错误就可以了(不需要在每个可能出错的地方都去捕获错误,只需要在合适的层次去捕获错误就可以达到效果,从而减少代码的书写量)

    例4 

    1. def foo(s):
    2. return 10 / int(s)
    3. def bar(s):
    4. return foo(s) * 2
    5. def main():
    6. try:
    7. bar('0')
    8. except Exception as e:
    9. print('Error:', e)
    10. finally:
    11. print('finally...')
    12. '''
    13. Error: division by zero
    14. finally...
    15. '''
    16. main()
  • 相关阅读:
    【爬虫】用wget命令爬虫的简易教程
    Spring知识点详解
    WebRTC实现简单音视频通话功能
    一文吃透eeui安卓开发
    Shell
    数论——快速幂
    RecursionError: maximum recursion depth exceeded while calling a Python object
    QT基础教程(文本绘制)
    linux内核启动阶段对设备树的解析
    要便利,更要安全可靠,数字钥匙优化升级迫在眉睫
  • 原文地址:https://blog.csdn.net/Hudas/article/details/126720552