Pyhton知识

异常处理

异常是程序发生错误的信号,程序一旦出错就会抛出异常,程序的运行随即终止

#异常的追踪信息
Traceback (most recent call last):
  File "D:\python\py", line 1, in <module>
    x
NameError: name 'x' is not defined
#异常的类型		#异常的内容

为何要处理异常?
为了增强程序的健壮性,即便是程序运行过程中出错了,也不要终止程序,而是捕捉异常并处理:将出错信息记录到日志内。

如何处理异常

  1. 语法上的错误(SyntaxError)
    处理方式:
    1、必须在程序运行前就改正

  2. 逻辑上的错误

# TypeError:数字类型无法与字符串类型相加
1+2# ValueError:当字符串包含有非数字的值时,无法转成int类型
num=input(">>: ") #输入hello
int(num)

# NameError:引用了一个不存在的名字x
x

# IndexError:索引超出列表的限制
l=['egon','aa']
l[3]

# KeyError:引用了一个不存在的key
dic={'name':'egon'}
dic['age']

# AttributeError:引用的属性不存在
class Foo:
    pass
Foo.x

# ZeroDivisionError:除数不能为0
1/0

2.2 针对逻辑上的错误又分成两种处理方式

  1. 错误发生的条件是可以预知的

错误发生的条件是可以预知的,使用if判断来解决

while (1):
    age = input('>>>').strip()  # 只要输入的不是数字,就会出错
    if age.isdigit():
        age = int(age)
        if age > 18:
            print('猜大了')
        elif age < 18:
            print('猜小了')
        else:
            print('猜对了')
            break
    else:
        print('必须输入数字')
  1. 错误发生的条件是不可以预知的
    为了保证程序的容错性与可靠性,即在遇到错误时有相应的处理机制不会任由程序崩溃掉,我们需要对异常进行处理,处理的基本形式为
try:
    被检测的代码块
except 异常类型:
    检测到异常,就执行这个位置的逻辑

首先运行try内的代码,如果其中有异常发生,就会跳到except 异常类型运行其中的代码,同级的代码块一但发生异常了,后续的同级代码就不会运行了如果被检测的子代码块没有任何异常发生,就会运行else代码,最终进入finally的代码

try:
    # 子代码块 有可能会抛出异常的代码
    print('子代码1')
    print('子代码2')
    print('子代码3')

except 异常类型1 as e:
    pass
except 异常类型2:
    pass

...
else:
# 如果被检测的子代码块没有异常发生,则会执行else的子代码
pass

finally:
# 无论被检测的子代码有无异常发生,都会执行finally的子代码,应该把检测代码中回收系统资源的代码
pass

本来程序一旦出现异常就整体结束掉了,有了异常处理以后,在被检测的代码块出现异常时,被检测的代码块中异常发生位置之后的代码将不会执行,取而代之的是执行匹配异常的except子代码块,其余代码均正常运行。

用法一:

print('start')

try:
    print('第一个BUG')
    l = ['aaa', 'bbb']
    l[3]
    print('第二个BUG')
    xxx
    print('第三个BUG')
    dic = {'a': 1}
    dic['aaa']

except IndexError as e:
    print('异常信息:', e)

print('end')

'''
start
第一个BUG
异常信息: list index out of range
end
'''

用法二:
Exception,万能异常在这里插入代码片

print('start')

try:
    print('第一个BUG')
    l = ['aaa', 'bbb']
    # l[3]
    print('第二个BUG')
    xxx
    print('第三个BUG')
    dic = {'a': 1}
    dic['aaa']

except IndexError as e:``
    print('异常信息:', e)

except Exception as e:
    print('所有异常都可以匹配')
print('end')
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐