异常处理

Posted 懒虫小园

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常处理相关的知识,希望对你有一定的参考价值。

一、异常

有时候我们写程序的时候,会出现一些错误或异常,导致程序终止。例如,做除法时,除数为0,会引起一个ZeroDivisionError

异常例子:

res=5/0
print(res)
#运行报错
#ZeroDivisionError: division by zero

字符串与整型不能相加异常:

import random
guess=random.randint(10,20)
num=input(请输入一个数字:)
print(num+guess)

# 请输入一个数字:6
# Traceback (most recent call last):
#   File "F:/自动化学习/课堂练习/day8/new_api/异常处理.py", line 6, in <module>
#     print(num+guess)
# TypeError: Can‘t convert ‘int‘ object to str implicitly

英文字符串转整型异常:

d={price:20}
price=input(请输入一个数字:)
d[price]-=int(price)
print(d)

# D:\System\Python3\python.exe F:/自动化学习/课堂练习/day8/new_api/异常处理.py
# 请输入一个数字:ert
# Traceback (most recent call last):
#   File "F:/自动化学习/课堂练习/day8/new_api/异常处理.py", line 16, in <module>
#     d[‘price‘]-=int(price)
# ValueError: invalid literal for int() with base 10: ‘ert‘

下标越界异常:

li=[1,2,3,4,5]
print(li[9])
# Traceback (most recent call last):
#   File "F:/自动化学习/课堂练习/day8/new_api/异常处理.py", line 27, in <module>
#     print(li[9])
# IndexError: list index out of range

二、异常处理

1、当代码中运行可能会遇到异常时,可以用try ... except  例如输入的值异常时:可以try ..except ValueError as e:

first=input(请输入除数)
second=input(请输入被除数)
#用户的输入不可预测,可能会输入英文等非法字符,所以在可能出错的代码前用try,尝试运行该代码是否有异常
try:
    first=int(first)
    second=int(second)
    res=first/second
    print(res)
#except 则是出错错误会怎么办,因为这个报错是ValueError,所以写ValueError
except ValueError as e:#e 代表错误信息,如果上面的两行代码出现了ValueError这个错误则走这里
    print(e)
    print(请输入整数)
else:#没有出错,这个是没有异常时候走,不是必须写的
    print(res)

#结果:
请输入除数f
请输入被除数2
invalid literal for int() with base 10: f

2、多个异常可以:try...excepy...excepy,例如输入的值异常、被除数不能为0异常时:可以try ...except ValueError as e:...exceptZeroDivisionErroras e:

first=input(请输入除数)
second=input(请输入被除数)
#用户的输入不可预测,可能会输入英文等非法字符,所以在可能出错的代码前用try,尝试运行该代码是否有异常
try:
    first=int(first)
    second=int(second)
    res=first/second
    print(res)
#except 则是出错错误会怎么办,因为这个报错是ValueError,所以写ValueError
except ValueError as e:#e 代表错误信息,如果上面的两行代码出现了ValueError这个错误则走这里
    print(e)
    print(请输入整数)
except ZeroDivisionError as e:
    print(e)
    print(除数不能为0)
else:#没有出错,这个是没有异常时候走,不是必须写的
    print(res)

#结果:请输入除数12
请输入被除数0
division by zero
除数不能为0

3、当多个异常可以只用一个try ...except Exception as e:

first=input(请输入除数)
second=input(请输入被除数)
#用户的输入不可预测,可能会输入英文等非法字符,所以在可能出错的代码前用try,尝试运行该代码是否有异常
try:
    first=int(first)
    second=int(second)
    res=first/second
except Exception as e:
    print(e)
else:#没有出错,这个是没有异常时候走,不是必须写的
    print(res)
#结果:
请输入除数qw
请输入被除数g
invalid literal for int() with base 10: qw

4、finally:不管出错或者没有出错都会执行它,这个不是必须写的。

一般要写的情况有:例如操作数据库成功或者失败,都要关闭数据库

first=input(请输入除数)
second=input(请输入被除数)
#用户的输入不可预测,可能会输入英文等非法字符,所以在可能出错的代码前用try,尝试运行该代码是否有异常
try:
    first=int(first)
    second=int(second)
    res=first/second
    print(res)
#except 则是出错错误会怎么办,因为这个报错是ValueError,所以写ValueError
# except ValueError as e:#e 代表错误信息,如果上面的两行代码出现了ValueError这个错误则走这里
#     print(e)
#     print(‘请输入整数‘)
# except ZeroDivisionError as e:
#     print(e)
#     print(‘除数不能为0‘)
except Exception as e:
    print(e)
else:#没有出错,这个是没有异常时候走,不是必须写的
    print(res)
finally:#不管出错或者没有出错都会执行它,不是必须写的。要写的情况:例如操作数据库成功或者失败,都要关闭数据库
    print(我是finally)

 

以上是关于异常处理的主要内容,如果未能解决你的问题,请参考以下文章

使用片段中的处理程序时出现非法状态异常

Java异常处理机制

java 反射代码片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

片段中的Android致命异常