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

原文地址:https://www.cnblogs.com/wqbin/p/11802760.html