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
    
    测试
  • 相关阅读:
    一键编译go文件命令.bat
    安装go语言,配置环境及IDE,只需3步
    Mysql show Status常用参数详解
    LFS:kernel panic VFS: Unable to mount root fs
    LFS: Interface eth0 doesn't exist
    转:Xshell显示找不到匹配的outgoing encryption算法怎么办
    NTP-ntpdate:no server suitable for synchronization found
    linux/module.h: No such file or directory 内核模块编译过程
    ASCII码表完整版
    [Firmware Warn]: GHES: Failed to read error status block address for hardware error source
  • 原文地址:https://www.cnblogs.com/package/p/15315425.html
Copyright © 2011-2022 走看看