Python 异常处理(自动化运维-10)
异常简介
在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是显示一个提示的页面。
Python 内置了一套try...except...finally...的错误处理机制。
示例代码:
try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')
#执行结果
try...
except: division by zero
finally...
END
当错误发生时,后续语句print('result:', r)不会被执行,except由于捕获到ZeroDivisionError,因此被执行。最后,finally语句被执行。然后,程序继续按照流程往下走。
如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:
异常种类
AttributeError 试图访问一个对象没有的属性,比如foo.x,但是foo没有属性x IOError 输入/输出异常;基本上是无法打开文件 ImportError 无法引入模块或包;基本上是路径问题或名称错误 IndentationError 语法错误(的子类) ;代码没有正确对齐 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] KeyError 试图访问字典里不存在的键 KeyboardInterrupt Ctrl+C被按下 NameError 使用一个还未被赋予对象的变量 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) TypeError 传入对象类型与要求的不符合 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 导致你以为正在访问它 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
异常实例
IndexError
# 没有异常各个代码快执行状态
a = list(range(8))
print(a)
try:
    x = a[0]
    print(x)  # 没有异常打印这个
except IndexError as e:
    print(e)
else:
    print("没有异常执行这个")
finally:
    print("无论有无异常都执行")
print("end")
#====执行结果====
[0, 1, 2, 3, 4, 5, 6, 7]
0
没有异常执行这个
无论有无异常都执行
end
# 有异常代码块执行状态
a = list(range(8))
print(a)
try:
    x = a[10]
    print(x)  # 没有异常打印这个
except IndexError as e:  # 捕获错误
    print(e)  # 打印错误
else:
    print("没有异常执行这个")
finally:
    print("无论有无异常都执行")
print("end")
#====执行结果====
[0, 1, 2, 3, 4, 5, 6, 7]
list index out of range
无论有无异常都执行
end
万能异常
name = "bushaoxun"
try:
    int(name)
    print("ok") # 捕获到错误不执行.
except Exception as e: # 万能异常,捕获各种异常
    print(e)
# 执行结果
invalid literal for int() with base 10: 'bushaoxun'
主动触发异常,抛出错误
class x(ValueError): # 错误是一个类,捕获错误就是捕获类的一个实例
    pass
try:
    raise x("我是一个兵") # 抛出错误
except x as e:
    print(e) #捕获错误
    raise # raise语句如果不带参数,就会把当前错误原样向上抛出
# 执行结果
我是一个兵
Traceback (most recent call last):
  File "C:/Users/bushaoxun/PycharmProjects/Learning/day2/yicang.py", line 11, in <module>
    raise x("我是一个兵") # 抛出错误
__main__.x: 我是一个兵
断言
assert 表达式 “抛出异常的值”
def foo(s):
    n = int(s)
    assert n != 0, 'n is zero!' # 如果 n !=0 不为真,抛出断言错误 AssertionError: n is zero!
    return 10 / n
def main():
    foo('0')
try:
    main()
except Exception as e:
    print(e)
# 执行结果
n is zero!
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号