zoukankan      html  css  js  c++  java
  • 44-异常(1)

    1. 分类与语法:

    • 系统解释器自动捕获异常
    • 写程序自己捕获并展示: try---except---else---finally
    • 注1:一旦引发了一个异常,程序就不会往下走,就不会引发其他的异常
    • 注2:try包住有可能会出错的代码块,然后为它定义一个except部分输出异常信息。那么try部分一旦发生异常,整个程序就不会因为异常而终止,而是去执行except部分,并且会继续往下跑程序。
    • 注3:当try部分没有出错,就继续执行else。
    try:
        num = 100
        print(num) #如果传入的num写成了numm
    except NameError as errorMsg:
        print('产生错误了:%s'%errorMsg)
    else:
        print('没有捕获到异常,真高兴')
    
    • 注4:不管try--except--else怎么执行,finally一定会执行
    • 注5:try和except必须有, else 和 finally可以没有。
    • 注6:在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
    import time
    f = None
    try:
        f = open('test.txt')    
        try:        
            while True:
                content = f.readline()            
                if len(content) == 0:                
                    break
                time.sleep(2)
                print(content)    
        except: 
            pass #如果在读取文件的过程中,产生了异常,那么就会捕获到,比如按下了ctrl+c终止cmd窗口
        finally:
            if f: #存在f并且f为True
                f.close()
                print('关闭文件')
    except:
        print("没有这个文件")
    

    2. 异常的传递:

    如果发生了一个异常,却没有对应的except语句来处理异常,这个异常就会向上一层抛。

    • try嵌套中传递:

      f = None
      try:
      f = open("test.txt")
      try:
      while True:
      line = f.readline()
      ind = line.index("hello") #查找hello的起始位置 {有可能发生ValueError}
      x = 10/0 #有可能发生ZEROERROR,但此处不用except处理它,异常会向上层抛
      #此处的上层即上一个try-except的except部分,如果它也不能处理
      #再向上一层的try-except抛...直至遇到最底层的异常基类ExceptionError
      if (line == ''):
      break
      except ValueError as ex: #仅仅捕捉了ind = line.index("hello")这里的异常,x=10/0没有捕捉
      print(ex)
      finally:
      print("里层的finally") #不一定会执行,有可能代码执行第二行open异常,就直接去外层的except语句了
      except (FileNotFoundError,ZeroDivisionError) as ex: #此处能处理x = 10/0,否则继续向上层抛
      print(ex)
      finally:
      print("finally")
      if f:
      f.close()

    • 函数调用中传递:

    由里层函数向外层函数抛,若外层也不能处理,就被基类ExceptionError接收,由编译器处理

    def test1():
        print("----test1-1----")
        print(num)
        print("----test1-2----") #不会运行
        
    def test2():
        print("----test2-1----")
        test1() #发生异常,向外层函数抛,但没有try-except处理,所以会抛至基类ExceptionError,由编译器处理
        print("----test2-2----") #不会运行
            
    def test3():
        try:
            print("----test3-1----")
            test1() #test1里面的异常会被传递至调用它的函数(由内向外抛)
            print("----test3-2----") #不会运行    
        except Exception as result:
            print("捕获到了异常,信息是:%s"%result)
        print("----test3-3----") #不会运行
            
    test3()
    print("
    ")
    test2()
  • 相关阅读:
    Javadoc注释的用法
    Java 和 Android系统环境变量设置
    [转载]Android开发新浪微博客户端 完整攻略 [新手必读]
    eclipse中Android程序字符编码不统一的解决方案
    用word2007写blog时表格的显示效果
    解决Vista中的文件关联图标问题。
    用word2007在博客园发布带图片的blog
    在c++中使用gotoxy
    动态多线程任务管理
    几个视频切割工具
  • 原文地址:https://www.cnblogs.com/LS1314/p/8504599.html
Copyright © 2011-2022 走看看