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

    1.什么是异常

      异常发生之后,异常之后的代码就不执行了

    2.什么是异常处理

      python解释器检测到错误,除法异常(也允许程序员自己触发异常)

      程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)

      如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

    3.为什么要进行异常处理

      python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行.所以必须提供一种异常处理机制来增强程序的健壮性和容错性

    4.如何进行异常处理

      

    1 while True:
    2     try:
    3         x = int(input("输入一个数字:"))
    4         break
    5     except ValueError:
    6         print("1")

    以上例子中,让用户输入一个合法的整数,但是允许用户中断这个程序,用户中断的信息会引发一个KeyboardInterrupt异常.

    try语句按照如下方式工作:

      首先,执行try子句(在关键字try和关键字except之间的语句)

      如果没有异常发生,忽略except语句,try子句执行后结束

      如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略.如果异常的类型和except之后的名称相符,那么对应的except子句将被执行.最后执行try语句之后的代码

      如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中

    一个try语句可能包含多个except子句,分别来处理不同的特定的异常.最多只有一个分支会被执行

    处理程序将只针对对应的try子句中的异常进行处理,而不是其他的try的处理程序中的异常

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

    1 except(RuntimeError,TypeError,NameError):
    2     pass

    try  except语句还有一个可选的else子句,如果使用这个子句,那么必须放在所有的except子句之后.这个子句将在try子句没有发生任何异常的时候执行,例如:

    1 for arg in sys.argv[1:]:
    2     try:
    3         f = open(arg,"r")
    4     except IOError:
    5         print("can not open",arg)
    6     else:
    7         print(arg,"has",len(f.readlines()),"lines")
    8         f.close()
    9         

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

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

    1 def this_fails():
    2     x = 1/0
    3 try:
    4     this_fails()
    5 except ZeroDivisionError as err:
    6     print("有运行错误",error)
    7 
    8 有运行错误:int division or modulo by zero

    万能异常:在python的异常中,有一个万能异常:Exception,它可以捕获任意异常,即:

      

    1 s = "hello"
    2 try:
    3     int(s)
    4 except Exception as e:
    5     print(e)

    如果想对于不同的异常定制不同的处理逻辑,就需要用到多分支

    1 s1 = "hello"
    2 try:
    3     int(s)
    4 except IndexError as e:
    5     print(e)
    6 except KeyError as e:
    7     print(e)
    8 except ValueError as e:
    9     print(e)

    5.主动抛出异常

      使用raie语句抛出一个指定的异常,例如:

      

    1 try:
    2     raise TypeError("类型错误")
    3 except Exception as e:
    4     print(e)
    5 
    6 TypeError:类型错误

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

    6.断言(assert)

    assert 断言是声明布尔值必须为真的判定,如果发生异常就说明表达式为假

    可以理解assert断言语句为raise-if-not,用来测试表达式,其返回值为假,就会触发异常.

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/s593941/p/9524781.html
Copyright © 2011-2022 走看看