33-异常处理

Posted zhubincheng

tags:

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

一、异常处理介绍

异常是程序发生错误的信号。程序一旦出现错误,便会产生一个异常,若程序中没有处理它,就会抛出该异常,程序的运行也随之终止。在Python中,错误触发的异常如下

技术图片

 

 

 1.1 异常处理的三个特征

  • 异常的追踪信息
  • 异常的类型
  • 异常的内容

1.2 为何处理异常

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

1.3 两类异常处理

而错误分成两种,一种是语法上的错误SyntaxError,这种错误应该在程序运行前就修改正确

>>> if  
  File "<stdin>", line 1
    if
     ^
SyntaxError: invalid syntax

另一类就是逻辑错误,常见的逻辑错误如

# 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.1 逻辑异常的可预知类型与不可预知类型

针对逻辑上的异常又分为两种处理方式

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

age=input(>>: ).strip() # 输入的只要不是数字就会出错
if age.isdigit():
    age=int(age)
    if age > 18:
        print(猜大了)
    elif age < 18:
        print(猜大了)
    else:
        print(猜对了)
else:
    print(必须输入数字)

二、不可预知     错误发生的条件是无法预知的

为了保证程序的容错性与可靠性,即在遇到错误时有相应的处理机制不会任由程序崩溃掉,我们需要对异常进行处理,处理的基本形式为

try:
    被检测的代码块
except 异常类型:
    检测到异常,就执行这个位置的逻辑

举例:

print(start...)
try:
    # 有可能会抛出异常的代码
    子代码1
    子代码2
    子代码3
except 异常类型1 as e:
    pass
except 异常类型2 as e:
    pass
...
else:
    如果被检测的子代码块没有异常发生,则会执行else的子代码
finally:
    无论被检测的子代码块有无异常发生,都会执行finally的子代码

print(end...)

 

2.2 具体用法

用法一:

print(start...)

try:
    print(1111111111)
    l=[aaa,bbbb]
    l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
    print(2222222222)
    xxx
    print(33333333)
    dic={a:1}
    dic[a]
except IndexError as e:
    print(异常的信息: ,e)

print(end....)

用法二:

print(start...)

try:
    print(1111111111)
    l=[aaa,bbbb]
    # l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
    print(2222222222)
    xxx
    print(33333333)
    dic={a:1}
    dic[a]
except IndexError as e:
    print(异常的信息: ,e)
except NameError as e:
    print(异常的信息: ,e)

print(end....)

用法三:

print(start...)

try:
    print(1111111111)
    l = [aaa, bbbb]
    l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
    print(2222222222)
    xxx
    print(33333333)
    dic = {a: 1}
    dic[aaa]
# except (IndexError, NameError) as e:
#     print(‘异常的信息: ‘, e)
# except KeyError as e:
#     print(‘字典的key不存在: ‘, e)
except Exception as e:  # 万能异常
    print(所有异常都可以匹配的到)
print(end....)

用法四:else不能单独与try配合使用,必须要搭配except

print(start...)

try:
    print(1111111111)
    print(2222222222)
    print(33333333)
except Exception as e:  # 万能异常
    print(所有异常都可以匹配的到)
else:
    print(====>)

print(end....)

用法五:finally可以单独与try配合使用

print(start...)

try:
    print(1111111111)
    l = [aaa, bbbb]
    l[3] # 抛出异常IndexError,该行代码同级别的后续代码不会运行
    print(2222222222)
    xxx
    print(33333333)
    dic = {a: 1}
    dic[aaa]
finally: # 不处理异常,无论是否发生异常都会执行finally的子代码
    print(====》》》》》应该把被检测代码中回收系统资源的代码放到这里)

print(end....)

 

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

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

Java异常处理机制

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

java 反射代码片段

33-异常处理

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