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!

 

posted @ 2018-04-08 17:38  步绍训  阅读(127)  评论(0)    收藏  举报