python异常处理

python异常处理

学习完本篇,你将会独立完成

  • 如何编写一个程序防止异常崩溃退出
  • 各种异常如何捕获
  • 为后面接口自动化以及web自动化做准备

什么是异常

  • 在程序运行过程中可能发生的不正常事件。
  • 会中断正在运行中的程序。
  • 异常是程序执行期间发生的各种意外或错误。比如说:
    ① 用户输入出错
    ② 所需文件找不到
    ③ 运行时磁盘空间不够
    ④ 内存不够
    ⑤ 算术运算错 (数的溢出,被零除…)
    ⑥ 数组下标越界
     以及其它情况

Python中常见的异常类型

  • NameError:尝试访问一个未申明的变量
>>>  v
NameError: name 'v' is not defined
  • ZeroDivisionError:除数为0
>>> v = 1/0ZeroDivisionError: int division or modulo by zero
  • SyntaxError:语法错误
>>> int intSyntaxError: invalid syntax (<pyshell#14>, line 1)
  • IndexError:索引超出范围
>>> List = [2]>>> List[3]Traceback (most recent call last):  File "<pyshell#18>", line 1, in <module>    List[3]IndexError: list index out of range
  • KeyError:字典关键字不存在
>>> Dic = {'1':'yes', '2':'no'}>>> Dic['3']Traceback (most recent call last):  File "<pyshell#20>", line 1, in <module>    Dic['3']KeyError: '3‘
  • IOError:输入输出错误
>>> f = open('abc')IOError: [Errno 2] No such file or directory: 'abc' 	
  • AttributeError:访问未知对象属性
>>> class Worker: def Work():  print("I am working")
>>> w = Worker()>>> w.aTraceback (most recent call last):  File "<pyshell#51>", line 1, in <module>    w.aAttributeError: 'Worker' object has no attribute 'a‘
  • ValueError:数值错误
>>> int('d')Traceback (most recent call last):  File "<pyshell#54>", line 1, in <module>    int('d')ValueError: invalid literal for int() with base 10: 'd‘
  • TypeError:类型错误
>>> iStr = '22'>>> iVal = 22>>> obj = iStr + iVal;Traceback (most recent call last):  File "<pyshell#68>", line 1, in <module>    obj = iStr + iVal;TypeError: Can't convert 'int' object to str implicitly
  • AssertionError:断言错误
>>> assert 1 != 1Traceback (most recent call last):  File "<pyshell#70>", line 1, in <module>    assert 1 != 1AssertionError

异常类的层次结构

  • 所有的python异常类都是系统类库中的BaseException类的子类,再由SystemExit、KeyboardInterrupt、GeneratorExit和Exception演变而来。大多数类有Exception演变而来,具体结构如下:
    图1

Python异常层次图

图2
异常名称 描述
BaseException 所有异常的基类
SystemExit 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
GeneratorExit 生成器(generator)发生异常来通知退出
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
StandardError 所有的内建标准异常的基类
Warning 警告的基类

异常处理

  • try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
    如果你不想在异常发生时结束你的程序,只需在try里捕获它。
  • 语法:
	try
	    <语法> #运行别的代码
	except <名字>:
	    <语句> #如果在try部份引发了'name'异常
	except <名字>,<数据>:
	    <语句> #如果引发了'name'异常,获得附加的数据
	else:
	    <语句> #如果没有异常发生
  • try工作原理
    当开始一个try语句,python就在当前程序的上下文中做标记,这样当异常出现时就可以回到这里,try字句先执行,接下来会发生什么依赖于于执行时是否出现异常。
    1.如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except字句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
    2.如果在try后的语句里发生了异常,却没有匹配的except字句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
    3.如果try字句执行时没有发生异常,python将执行else语句后面的语句(如果此时有else语句),然后控制通过整个try语句

try、except带参数示例

  • demo描述:打开一个文件,在该文件中的内容写入内容,且并未发生异常:
#!/usr/bin/python # 
-*- coding: UTF-8 -*- 
try: 
    fh = open("testfile", "w") 
    fh.write("这是一个测试文件,用于测试异常!!") 
except IOError: 
    print "Error: 没有找到文件或读取文件失败" 
else: 
    print "内容写入文件成功" fh.close()
#!/usr/bin/python # 
-*- coding: UTF-8 -*- 
try: 
    fh = open("testfile", “r") 
    fh.write("这是一个测试文件,用于测试异常!!") 
except IOError: 
    print "Error: 没有找到文件或读取文件失败" 
else: 
    print "内容写入文件成功" fh.close()

异常多种形态

Except不带参数语法:
try: 
    正常的操作 
    ...................... 
except: 
    发生异常,执行这块代码 
    ...................... 
else: 
    如果没有异常执行这块代码
Except带多种异常语法:	
try: 
    正常的操作 
    ..................... 
except(Exception1 [,...ExceptionN]]]): 
     #发生以上多个异常中的一个,
     #执行这块代码 
     ...................... 
else: 
    如果没有异常执行这块代码
try-finally 语句
语法:
try: 
    <语句> 
finally: 
     <语句> #退出try时总会执行 raise

try-finally实例

# -*- coding: UTF-8 -*-
 try: 
	fh = open("testfile", “r") 
	fh.write("这是一个测试文件,用于测试异常!!") 
finally: 
	print "Error: 没有找到文件或读取文件失败"
	
执行顺序:先执行try语句,最后执行finally语句。
# -*- coding: UTF-8 -*- 
try: 
     fh = open("testfile", “r") 
     try: 
            fh.write("这是一个测试文件,用于测试异常!!") 
     finally: 
            print "关闭文件" fh.close() 
except IOError: 
     print "Error: 没有找到文件或读取文件失败"

思考:try嵌套,思考执行顺序

异常的参数

  • 异常参数:一个异常可以可以带上参数,可作为输出的信息参数
语法:try:
	     正常的操作
	     …………………
	except ExceptionType, Argument:
	     你可以在这输出 Argument 的值...
  • 例子:
# -*- coding: UTF-8 -*- 
# 定义函数 
def temp_convert(var):
    try: 
         return int(var) 
    except ValueError, Argument: 
         print "参数没有包含数字
", Argument 
If __name__ == “__main__”
      # 调用函数 
       temp_convert("xyz");
打印结果:
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

触发异常

  • raise语法: raise [Exception [, args [, traceback]]]
  • 说明:语句中Exception是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None"。
    最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
#!/usr/bin/python 
# -*- coding: UTF-8 -*- 
# 定义函数 
def mye( level ): 
   if level < 1: 
   raise Exception("Invalid level!", level) 
   # 触发异常后,后面的代码就不会再执行 

try: 
   mye(0) 
   // 触发异常 
except Exception:
    print 1 else: print 2
测试
原文地址:https://www.cnblogs.com/package/p/15315425.html