zoukankan      html  css  js  c++  java
  • python的异常处理

    python的try语句有两种风格
    一:种是处理异常(try/except/else)
    二:种是无论是否发生异常都将执行最后的代码(try/finally)

    try/except/else风格
    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语句。

    与Python异常相关的关键字:
    关键字          关键字说明
    raise           抛出/引发异常
    try/except      捕获异常并处理
    pass            忽略异常
    as              定义异常实例(except IOError as e)
    finally         无论是否出现异常,都执行的代码
    else            如果try中的语句没有引发异常,则执行else中的语句
    except
       老版本的Python,except语句写作"except Exception, e",Python 2.6后应写作"except Exception as e"。
    使用
    except
    而不带任何异常类型:
    try:

    do something

    except:

    handle except

        会捕获所有异常,包括键盘中断和程序退出请求(用sys.exit()就无法退出程序了,因为异常被捕获了),因此慎用。
    使用
    except Exception as e
    可以捕获除与程序退出sys.exit()相关之外的所有异常


    try/finally风格
    try:
    <语句>
    finally:
    <语句> #退出try时总会执行

    python总会执行finally子句,无论try子句执行时是否发一异常。
    1、如果没有发生异常,python运行try子句,然后是finally子句,然后继续。
    2、如果在try子句发生了异常,python就会回来执行finally子句,然后把异常递交给上层try,控制流不会通过整个try语句。
    当你想无论是否发生异常都确保执行某些代码时,try/finally是有用的。

    这个在打开文件的时候有用 finally总是在最后close()文件

    try语句子句形式表
    except: 捕获所有异常
    except name: 只捕获特定的异常
    except name,value: 捕获异常和它的附加数据(将异常的信息保存到value,)
    except (name1,name2): 捕获任何列出的异常
    else: 如果没有异常
    finally: 总是执行

    >>> try:
    f = open('file.txt')
    except IOError, e:
    print e
    else:
    print 'wrong'

    [Errno 2] No such file or directory: 'file.txt'
    最新的python版本 支持try/except/finally
    try: 1:如果x没有异常,执行z,i
    x 2:如果x有异常, 一:如果except捕捉到异常则执行y,i
    except(name): 二:没捕捉到,执行i,然后返回内置异常处理
    y
    else:
    z
    finally:
    i

    但是,不知道"语句1至语句N"在执行会出什么样的异常,还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except ......"这句应怎样来写呢?
    总结了一下至少3个方法:
    方法一:捕获所有异常
    try:
    a=b
    b=c
    except Exception,e:
    print Exception,":",e
    try:
    a=b
    b=c
    except Exception,e:
    print Exception,":",e
    www.2cto.com
    方法二:采用traceback模块查看异常
    import traceback
    try:
    a=b
    b=c
    except:
    traceback.print_exc()
    import traceback
    try:
    a=b
    b=c
    except:
    traceback.print_exc()
    方法三:采用sys模块回溯最后的异常
    import sys
    try:
    a=b
    b=c
    except:
    info=sys.exc_info()
    print info[0],":",info[1]
    import sys
    try:
    a=b
    b=c
    except:
    info=sys.exc_info()
    print info[0],":",info[1]
    但是,如果你还想把这些异常保存到一个日志文件中,来分析这些异常,那么请看下面的方法:
    把 traceback.print_exc() 打印在屏幕上的信息保存到一个文本文件中
    try:
    a=b
    b=c
    except:
    f=open("c:log.txt",'a')
    traceback.print_exc(file=f)
    f.flush()
    f.close()

    引发异常

    你可以使用raise语句 引发 异常。你还得指明错误/异常的名称和伴随异常 触发的 异常对象。你可以引发的错误或异常应该分别是一个ErrorException类的直接或间接导出类:

    #!/usr/bin/python
    # Filename: raising.py


    class ShortInputException(Exception):
       '''A user-defined exception class.'''
       def __init__(self, length, atleast):
       Exception.__init__(self)
       self.length = length
       self.atleast = atleast


    try:
       s =
    raw_input('Enter something --> ')
       if len(s) < 3:
       raise ShortInputException(
    len(s), 3)
       # Other work can continue as usual here
    except EOFError:
       print ' Why did you do an EOF on me?'
    except ShortInputException, x:
       print 'ShortInputException: The input was of length %d,
       was expecting at least %d'
    % (x.length, x.atleast)
    else:
       print 'No exception was raised.'


    如何工作:我们创建了异常类型(可以使用任何预定义的异常/错误),这个新的异常类型是ShortInputException类。它有两个域——length是给定输入的长度,atleast则是程序期望的最小长度。

    except从句中,我们提供了错误类和用来表示错误/异常对象的变量。这与函数调用中的形参和实参概念类似。在这个特别的except从句中,我们使用异常对象的lengthatleast域来为用户打印一个恰当的消息。

  • 相关阅读:
    react路由组件&&非路由组件
    react函数式组件(非路由组件)实现路由跳转
    react使用antd组件递归实现左侧菜单导航树
    【LeetCode】65. Valid Number
    【LeetCode】66. Plus One (2 solutions)
    【LeetCode】68. Text Justification
    【LeetCode】69. Sqrt(x) (2 solutions)
    【LeetCode】72. Edit Distance
    【LeetCode】73. Set Matrix Zeroes (2 solutions)
    【LeetCode】76. Minimum Window Substring
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205627.html
Copyright © 2011-2022 走看看