异常处理

Posted wangkaiok

tags:

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

# 异常分为两种:
# 语法异常。
# name # NameError

# if 3 > 2:
#     print(666)
#    print(333)  # IndentationError

# 逻辑异常。
# int(input(‘>>>‘))
# l1 = [1, 2, 3]
# print(l1[100])  # IndexError

# dic = {‘name‘: ‘alex‘}
# print(dic[‘age‘])  # KeyError
# print(666)

什么是异常?

异常发生之后,代码就不执行了。

参考:https://www.cnblogs.com/jin-xin/articles/9291590.html

# 1,if else...... 对于if语句处理异常只能处理简单的,如果考虑多个条件 不合适。
# try except ...

1、 单支情况。 try except
# 尝试着运行try里面的代码,出现错误,按照错误类型去寻找相应的except,找到执行此except代码,然后程序继续运转。

try:
    print(111)
    print(222)
    print(333)
    name
    l1 = [1, 2, 3]
    print(l1[100])

except NameError:
    print(name  is not defined)
print(666)

技术分享图片

技术分享图片

技术分享图片

技术分享图片


2、 多支情况。try except except except .... 程序分流
try:
    print(111)
    print(222)
    print(333)
    name
    l1 = [1, 2, 3]
    print(l1[100])
    dic = {name: alex}
    print(dic[age])

except NameError:
    print(name  is not defined)

except IndexError:
    print(索引超出范围....)

except KeyError:
    print(没有此key...)

print(666)

技术分享图片

技术分享图片

技术分享图片

3、 万能处理。 Exception包含了python提供的所有错误类型

技术分享图片

小结:

# 万能: 如果你对错误原因不关心,只是想不让其报错,那么程序中你就用万能处理。
# 多分支: 如果你对错误原因需要进行不同分流或者程序处理,那么就需要多分支。
对blog进行修改:

技术分享图片

技术分享图片

 

技术分享图片

这样有欠缺,我们要实现不同的错误报不同的类型,用多分支。

 技术分享图片

 

技术分享图片

技术分享图片

 

4、 多分支 加 万能处理。 : 对某些错误需要进行分流处理,剩下的错误直接跳过。

技术分享图片

5、try except else

# 如果出现异常 就不会走else逻辑,不出现异常,则执行else逻辑。

技术分享图片

 try else举例:

出现异常,就不走else程序。也相当于支持事物的回滚。else成功之后才行else

try:
    print(二狗 向 脸哥转了 200元)
    name
    print(脸哥确认收到了 200元)

except NameError:
    print(name  is not defined)

else:
    print(转账成功)
print(666)

技术分享图片

 6、try except else finally

# finally 无论报不报错都执行,如果报错,finally是在报错之前执行的!!!

技术分享图片

finally举例:文件操作:

# f1 = open(‘a.log‘, encoding=‘utf-8‘)
# f1.read()
# ‘‘‘
# 各种对文件操作的代码,但是可能会出错,出错之后,你的文件句柄无法关闭。
# ‘‘‘
# f1.close()

技术分享图片

# finally 会在retrurn之前先执行。
def func(a):
    try:
        a += 1
        return a
    finally:
        print(333)

print(func(5))

技术分享图片

finally用在哪里: 以后如果遇到关闭连接,数据库连接等等。

 

7、自定义异常处理(捕捉异常)

# python提供了大部分异常,但是不是所有,比如 大的框架的手机连接问题,网络引发的代码问题等等。
# Exception 也处理不了。

技术分享图片

# EOFError
# NameError
# Exception

# 程序中如果出现了python解决不了的异常 比如 PhoneConnectionError

技术分享图片


class PhoneConnectionError(BaseException):
    pass
try:
    raise PhoneConnectionError(类型错误)   #raise就是主动抛出一个异常
except PhoneConnectionError:
    print(手机连接出现问题)

技术分享图片

 

8、断言

# 源码中经常遇到  条件只要不成立,我就抛出错误
assert 1 == 1  #不报错
assert 1 == 2  #报错AssertionError

part9:try..except的方式比较if的方式的好处

try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性

异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性 

使用try..except的方式

1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

什么时候用异常处理

有的同学会这么想,学完了异常处理后,好强大,我要为我的每一段程序都加上try...except,干毛线去思考它会不会有逻辑错误啊,这样就很好啊,多省脑细胞===》2B青年欢乐多

try...except应该尽量少用,因为它本身就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的
这种东西加的多了,会导致你的代码可读性变差,只有在有些异常无法预知的情况下,才应该加上try...except,其他的逻辑错误应该尽量修正

 




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

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

Java异常处理机制

java 反射代码片段

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

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

片段中的Android致命异常