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

    1.异常简介

    即使语句或表达式在语法上是正确的,但在尝试执行它时也可能导致错误。执行期间检测到的错误称为异常

    实际上我们学习java的时候分为编译期异常和运行期异常,但是python没有编译期异常<可以暂且这么认为>。

    因为我们对运行期异常可以捕获并操作所以异常并不是致命的。

    try:
        a=1/0
    except Exception as e:
        print("有错误")
        pass

    上面的代码及时有异常也可以顺利运行。

    while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except TypeError:
            print("Oops!  That was no valid number.  Try again...")

    try语句的工作原理如下:

    • 首先,执行try子句tryand except关键字之间的语句)。
    • 如果没有异常发生,则将跳过except子句,并且该try语句的执行 完成。
    • 如果在try子句执行期间发生异常,则该子句的其余部分将被跳过。然后,如果其类型与以except关键字命名的异常匹配 ,则执行except子句,然后在try语句之后继续执行
    • 如果发生与except子句中命名的异常不匹配的异常:如果有外部try语句 则将其传递给外部try语句,否则将其传递给外部语句。如果未找到任何处理程序,则它是未处理的异常,并且执行停止并显示红色消息。
    while True:
        try:
            x = int(input("Please enter a number: "))
            break
        except TypeError:
            pass
        except ValueError as ve:
            pass
        except (ImportError,IOError) as (ime,ioe):
            pass
        except:
            pass
    1. 一条try语句可以有一个以上的except子句,以指定不同异常的处理程序,最多将执行一个处理程序
    2. except子句可以将多个异常命名为带括号的元组
    3.  处理程序仅处理在相应的try子句中发生的异常,而不处理同一try语句的其他处理程序中的异常。
    4. except子句可以省略名称,以用作通配符。请谨慎使用,因为这样很容易掩盖实际的编程错误!它也可以用于打印错误消息,然后重新引发异常(允许调用者也处理该异常)

    2.对异常类的介绍

    我们既可以使用python自带异常类,可以自定义异常类。

    2.1.python异常类

    +-- BaseException (new; broader inheritance for subclasses)
        +-- Exception
            +-- GeneratorExit (defined in PEP 342 [1])
            +-- StandardError
                +-- ArithmeticError
                    +-- DivideByZeroError
                    +-- FloatingPointError
                    +-- OverflowError
                +-- AssertionError
                +-- AttributeError
                +-- EnvironmentError
                    +-- IOError
                    +-- EOFError
                    +-- OSError
                +-- ImportError
                +-- LookupError
                    +-- IndexError
                    +-- KeyError
                +-- MemoryError
                +-- NameError
                    +-- UnboundLocalError
                +-- NotImplementedError (stricter inheritance)
                +-- SyntaxError
                    +-- IndentationError
                        +-- TabError
                +-- TypeError
                +-- RuntimeError
                +-- UnicodeError
                    +-- UnicodeDecodeError
                    +-- UnicodeEncodeError
                    +-- UnicodeTranslateError
                +-- ValueError
                +-- ReferenceError
            +-- StopIteration
            +-- SystemError
            +-- Warning
                +-- DeprecationWarning
                +-- FutureWarning
                +-- PendingDeprecationWarning
                +-- RuntimeWarning
                +-- SyntaxWarning
                +-- UserWarning
            + -- WindowsError
        +-- KeyboardInterrupt (stricter inheritance)
        +-- SystemExit (stricter inheritance)
    python异常类

    2.2.python自定义类

    自定义异常:

    class ShortInputException(Exception):
        '''自定义异常类'''
        def __init__(self, length, atleast):
            self.length = length
            self.atleast = atleast
    
    try:
        s = input('please input:')
        if len(s) < 3:
            raise ShortInputException(len(s), 3)
    except ShortInputException as e:
        print('输入长度是%s,长度至少是%s' %(e.length, e.atleast))
    else:
        print('nothing...')

    如果输入字符长度小于3,那么将会抛出 ShortInputException 异常:

    >>> please input:qw
        输入长度是2,长度至少是3 

    自定义异常的继承与执行:

    如果except子句中的类是同一类或其基类,则该子句与异常兼容(但不是相反的方式-列出派生类的except子句与基类不兼容)

    class B(Exception):
        pass
    
    class C(B):
        pass
    
    class D(C):
        pass

    我们看一下顺序

    for cls in [B, C, D]:
        try:
            raise cls()
        except D:
            print("D")
        except C:
            print("C")
        except B:
            print("B")

    for cls in [B, C, D]:
        try:
            raise cls()
        except B:
            print("B")
        except C:
            print("C")
        except D:
            print("D")

    3.引发异常

    raise语句可以强制发生指定的异常

    >>> raise NameError('HiThere')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: HiThere

    If an exception class is passed, it will be implicitly instantiated by calling its constructor with no arguments

    --如果传递了异常类,则将通过不带参数的构造函数来隐式实例化该异常类。

    确定是否引发了异常但不打算处理该异常,则可以使用一种更简单的raise语句形式来重新引发该异常:

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

    4.else,finally

    https://www.cnblogs.com/wqbin/p/11803948.html

  • 相关阅读:
    前后端渲染
    与你一起的日子
    Python 字符串转化成整形数组
    Python列出文件和目录
    Eclipse 导入Gson包
    java.lang.NoClassDefFoundError (Eclipse)
    成功的背后!(给所有IT人)
    事件与概率
    Servlet获取form表单上传文件及其他参数
    Servelt学习笔记之二——使用Servlet提取表单中的数据
  • 原文地址:https://www.cnblogs.com/wqbin/p/11802760.html
Copyright © 2011-2022 走看看