zoukankan      html  css  js  c++  java
  • Python3学习笔记16-错误和异常

    使用try...except可以处理异常

    异常处理

    import sys
    try:
        print('try...')
        r = 10/0
        print('result:',r)
    except ZeroDivisionError as e:#
        print('except:',e)
    finally:
        print('finally...')
    print('end')

    如果在try语句块中出现错误,剩下try部分剩下的语句不会继续被执行

    如果异常类型和except之后的名称相符,就会执行对应的except下的语句

    如果有finally语句块,则执行finally语句块,至此,执行完毕

    把0改成2,由于没有错误发生,except部分会不执行,但是finally如果有,则一定会被执行(可以没有finally语句)

    捕获多个异常

    try:
        print('try...')
        r = 10/int('a')
        print('result:',r)
    except ValueError as e:
        print('ValueError:',e)
    except ZeroDivisionError as e :
        print('ZeroDivisionError:',e)
    print('finally')

    int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError

    一个try语句可能有多个except子句,分别来处理不同的异常

    except (RuntimeError,TypeError,NameError):
    #	pass

    一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组



    #可以在except后面加个else,当没有错误发生的时候,会自动执行else语句

    for arg in sys.argv[1:]:
        try:
            f = open(arg, 'r')
        except IOError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()

    使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到的、而except又没有捕获的异常

    异常处理并不仅仅处理那些直接发生在try子句中的异常,而且还能处理子句中调用的函数(甚至间接调用的函数)里抛出的异常

    def foo(s):
        return 10 / int(s)
    
    def bar(s):
        return foo(s) * 2
    
    def main():
        try:
            bar('0')
        except Exception as e:
            print('Error:', e)
        finally:
            print('finally...')

    函数main()调用foo(),foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:

    也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦

    Python的错误其实也是class,所有的错误类型都继承自BaseException,所以在使用except时需要注意的是,它不但捕获该类型的错误,还把其子类也“一网打尽”

    try:
        foo(2)
    except ValueError as e:
        print('ValueError')
    except UnicodeError as e:
        print('UnicodeError')

    第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了

    抛出异常

    使用raise语句可以抛出一个指定的异常

    try:
        raise NameError('HiThere')
    except NameError:
        print('An exception flew by!')
        raise

    raise 唯一的一个参数指定了要被抛出的异常。它必须是一个异常的实例或者是异常的类(也就是 Exception 的子类)

    只想知道这是否抛出了一个异常,并不想去处理它,那么一个简单的 raise 语句就可以再次把它抛出

  • 相关阅读:
    CI框架(Codeigniter)总结
    ssh自动下载SFTP文件
    数据库设计原则
    Java代码性能优化的 39个细节
    quartz定时任务时间设置
    Myeclipse 反编译工具插件
    Maven -- 使用Myeclipse创建Maven项目
    详解Java Web项目启动执行顺序
    java web项目下的lib和build path 中jar包问题解惑
    java读取存在src目录下和存在同级目录下的配置文件
  • 原文地址:https://www.cnblogs.com/myal/p/9337414.html
Copyright © 2011-2022 走看看