[Python] 捕获异常

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

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

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

1. try...except语句

语法结构

try:
    <可能抛出异常的语句>
except:
    <处理异常>

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

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

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

实例

try:
    num = int(input('请输入一个整数:'))
    print(num * 10)
except:
    print('提示:请输入整数!')

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

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

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

语法结构

try:
    <可能抛出异常的语句>
except:
    <处理异常>
else:
    <语句>

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

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

实例

例1 

try:
    num = int(input('请输入:'))
except:
    print('输入的值不是整数')
else:
    print('输入的值是整数',num)

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

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

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

例2

try:
    print('try...')
    res = 10 / int('2')
    print('result:', res)
except ValueError as e:
    print('ValueError:', e)
else:
    print('no error!')
finally:
    print('finally...')
print('END')

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

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

例3

while True:
    try:
        x = int(input('Enter the first number:'))
        y = int(input('Enter the second number:'))
        value = x / y
        print('x/y is',value)
    except:
        print('Invalid input.Please try again!!')
    else:
        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语句

语法结构

try:
    <可能抛出异常的语句>
except:
    <处理异常>
finally:
    <语句>

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

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

实例

例1

try:
    print('try...')
    res = 10 / 0
    print('result:', res)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
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 

try:
    print('try...')
    res = 10 / 2
    print('result:', res)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')

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

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

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

例3

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

try:
    print('try...')
    res = 10 / int('abc')
    print('result:', res)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
finally:
    print('finally...')
print('END')

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

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

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

例4 

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except Exception as e:
        print('Error:', e)
    finally:
        print('finally...')

'''
Error: division by zero
finally...
'''
main()
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值