zoukankan      html  css  js  c++  java
  • 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
    
    测试
  • 相关阅读:
    LSMW TIPS
    Schedule agreement and Delfor
    Running VL10 in the background 13 Oct
    analyse idoc by creation date
    New Journey Prepare
    EDI error
    CBSN NEWS
    Listen and Write 18th Feb 2019
    Microsoft iSCSI Software Target 快照管理
    通过 Microsoft iSCSI Software Target 提供存储服务
  • 原文地址:https://www.cnblogs.com/package/p/15315425.html
Copyright © 2011-2022 走看看