Python异常处理

一、异常:

异常:在编译阶段没问题,在执行阶段才报错

 

查看异常:

  ① 错误代码,从下往上看,找到自己写的代码块

  ② 根据错误类型判断

 

二、异常处理

即便放在try语句的内容,在遇到报错之后也会中断这段语句的执行

报错之后,try里面剩余的代码不会执行,但是在try外面的内容还会继续执行

 

① 单分支

try:
    num = int(input('num>>>').strip())
    print(111)
except ValueError:
    print('输入的非数字')

print(666)

'''
num>>>a
输入的非数字
666
'''

 

② 多分支

li = [1,2,3,4,5]
try:
    num = int(input('num>>>').strip())
    print(li[num-1])
except ValueError:
    print('输入的非数字')
except IndexError:
    print('输入的数字超过列表的长度')

print(666)

'''
num>>>10
输入的数字超过列表的长度
666
'''

 

③ 合并多分支

li = ['a','b','c']
try :
    num = int(input('num>>>').strip())
    print(li[num-1])
except (ValueError,IndexError):
    print('输入有误')

print(123)

'''
num>>>100
输入有误
123
'''

 

三、万能异常

Exception 万能异常,一定要配合as语法使用,找出报错的内容

li = ['a','b','c']
try :
    import aaa
    open('bbbbbb')
    li.remove(10)
    num = int(input('num>>>').strip())
except Exception as error:
    print(error)

print(123)

'''
No module named 'aaa'
123
'''

 

多分支和万能异常同时存在:

万能异常一定要放在最后,并且加上as语句

 

四、异常处理中的其他机制

else

如果没发生异常,就执行else语句,但是不能脱离except

else的作用:反馈这段代码顺利执行

 

当异常发生时,else不执行

try :
    a1 = 1
    a2 = b
    print(a1 + b2)
except NameError:
    print('NameError')
else:
    print('没异常发生')
    
'''
NameError
'''

 

当异常没产生,执行else

try :
    a1 = 1
    a2 = 2
    print(a1 + a2)
except NameError:
    print('NameError')
else:
    print('没异常发生')

'''
3
没异常发生
'''

 

finally

finally 无论如何都要执行,即便程序出错和return会也执行finally,能脱离except
finally 一般用于收尾工作,比如:关闭文件,写日志,关闭网络资源,关闭数据库连接

def func():
    try:
        f = open('a')      # 文件存在
        return f.readlines()
    finally:
        f.close()           
        print('关闭文件')    # 虽然return,但执行了finally的代码


func()  # 关闭文件

 

五、主动抛异常

使用关键字 raise语句自己触发异常

语法:raise 异常名(异常的内容(字符串))

raise ValueError('ValueError error')
#     raise ValueError('ValueError error')
# ValueError: ValueError error

 

六、自定义异常

 BaseException 异常类的祖宗

使用:继承父类BaseException,实现父类的init,传入异常信息

class CustomException(BaseException):
    def __init__(self,msg):
        super().__init__()
        self.msg = msg

    def __str__(self):
        return self.msg

raise CustomException('自定义异常')

'''
    raise CustomException('自定义异常')
__main__.CustomException: 自定义异常
'''

七、断言

assert 1==1
print(666)

assert 1==2
print(777)

'''
    assert 1==2
AssertionError
'''

断言相当于if判断,assert满足才执行下面的代码,如果不满足条件就报错

八、语法总结:

try...except

try...except...else

try...finally

try...except...finally

try...except...else...finally

原文地址:https://www.cnblogs.com/st-st/p/9629364.html