异常处理

'''
整体说明:
01 异常的分类:异常分为两种,即语法异常和逻辑异常两种。异常的处理主要是对逻辑异常的处理。
02 语法错误:这种错误,根本过不了pyrhon解释器的语法监测,必须在程序执行前进行改正。
03 逻辑错误:编写时逻辑上的漏洞或者是缺陷。
04 python中的异常种类
    (1)常见种类
        AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
        IOError 输入/输出异常;基本上是无法打开文件
        ImportError 无法引入模块或包;基本上是路径问题或名称错误
        IndentationError 语法错误(的子类) ;代码没有正确对齐
        IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
        KeyError 试图访问字典里不存在的键
        KeyboardInterrupt Ctrl+C被按下
        NameError 使用一个还未被赋予对象的变量
        SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
        TypeError 传入对象类型与要求的不符合
        UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
        导致你以为正在访问它
        ValueError 传入一个调用者不期望的值,即使值的类型是正确的
    (2)更多异常
        ArithmeticError
        AssertionError
        AttributeError
        BaseException
        BufferError
        BytesWarning
        DeprecationWarning
        EnvironmentError
        EOFError
        Exception
        FloatingPointError
        FutureWarning
        GeneratorExit
        ImportError
        ImportWarning
        IndentationError
        IndexError
        IOError
        KeyboardInterrupt
        KeyError
        LookupError
        MemoryError
        NameError
        NotImplementedError
        OSError
        OverflowError
        PendingDeprecationWarning
        ReferenceError
        RuntimeError
        RuntimeWarning
        StandardError
        StopIteration
        SyntaxError
        SyntaxWarning
        SystemError
        SystemExit
        TabError
        TypeError
        UnboundLocalError
        UnicodeDecodeError
        UnicodeEncodeError
        UnicodeError
        UnicodeTranslateError
        UnicodeWarning
        UserWarning
        ValueError
        Warning
        ZeroDivisionError
05 异常处理
    (1)使用if判断式
        a)缺点1:使用if的方式我们只为第一段代码加上了异常处理,但这些if,跟你的代码逻辑并无关系,这样你的代码会因为可读性差而不容易被看懂。
        b)缺点2:这只是我们代码中的一个小逻辑,如果类似的逻辑多,那么每一次都需要判断这些内容,就会倒置我们的代码特别冗长。
        c)总结:if是可以解决异常的,只是存在1,2的问题,所以,千万不要妄下定论if不能用来异常处理。
    (2)python异常处理的私人定制:为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理
'''

# 异常处理
# part1:基本语法
'''
try:
     被检测的代码块
except 异常类型:
     try中一旦检测到异常,就执行这个位置的逻辑
'''
f = open('a.txt')

g = (line.strip() for line in f)
for line in g:
    print(line)
else:
    f.close()
    
# part2:单支情况 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)

# part3::多支情况。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)

# part4:万能处理。
# 万能: 如果你对错误原因不关心,只是想不让其报错,那么程序中你就用万能处理。
# 如果你对错误原因需要进行不同分流或者程序处理,那么就需要多分支。
try:
    print(111)
    print(222)
    print(333)
    # name
    l1 = [1, 2, 3]
    # print(l1[100])
    dic = {'name': 'alex'}
    print(dic['age'])

except Exception as e:  # 默认都是e
    print(e)

# part5:多分支 加 万能处理。 : 对某些错误需要进行分流处理,剩下的错误直接跳过。
try:
    print(111)
    print(222)
    print(333)
    # name
    int(input(''))
    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...')

except Exception:
    pass
print(666)

# part 6:try except else
# 如果出现异常 就不会走else逻辑,不出现异常,则执行else逻辑。
try:
    print(111)
    print(222)
    name

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

else:
    print(333)
print(666)


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

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

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

# part 7:try except else finally
# finally 无论报不报错都执行,如果报错,finally是在报错之前执行的!!!
try:
    print('二狗 向 脸哥转了 200元')
    name
    print('脸哥确认收到了 200元')

except KeyError:
    print('name  is not defined')

finally:
    print(666)
    
# finally的应用
# 应用01:文件句柄的关闭
# 应用02:关闭连接,比如数据库连接等需求。
# 应用举例如下:
# 文件操作:

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

# 解决方案:
try:
    f1 = open('a.log', encoding='gbk')
    f1.read()
    f1.write('sfdsf')
    '''
    各种对文件操作的代码,但是可能会出错,出错之后,你的文件句柄无法关闭。
    '''
finally:
    print(666)
    f1.close()


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

print(func(5))

# part8:自定义异常处理

# 程序中如果出现了python解决不了的异常 比如 PhoneConnectionError
class PhoneConnectionError(BaseException):
    pass
try:
    raise PhoneConnectionError('类型错误')
except PhoneConnectionError:
    print('手机连接出现问题')
    
# part9:断言

# 源码中经常遇到  条件只要不成立,我就抛出错误
 # assert 1 == 2
原文地址:https://www.cnblogs.com/mayugang/p/10093655.html