(十三)Python:异常处理

有过JAVA语言的学习经验都知道程序即使没有语法错误,但是运行过程中还是会有些“毛病”,这些毛病我们称其为异常
这里写图片描述

捕获异常

基本语法规则:

try:
    #可能会产生异常的语句块
except 异常类型:
    #捕获异常后的处理

示例代码:

try:
    a=1/0
    print("异常产生之后的代码")
except ZeroDivisionError:
    print("发生异常后的处理")

print("最后的处理")

这里写图片描述
异常处理流程:
      首先执行try和except之间的代码块,如果没有异常产生,except中的语句块不执行;如果产生异常,在异常产生处之后的代码不再执行。如果异常的类型和except的名称相符,则执行对应的except子句的代码。最后执行try except 语句之后的代码 。

一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。但是只有一个except子句会被执行。同时,一个except中可以有多个异常类型,用元组存放这些异常类型。并且我们可以使用as为异常类型取别名。和JAVA中的异常处理一样,python中也有finally子句,不管发生异常与否,finally子句的代码一定会执行。

try:
    #可能会产生异常的语句块

except 异常1 as 别名:
    #捕获异常1后的处理

except (异常2,异常3,异常4……异常n):
    #捕获异常后的处理

except:#可以不用写具体异常类型,作为通配符使用
    #捕获到上面之外的其他异常
finally:
    #最后一定会执行的代码,即使发生异常

测试示例:

def fun():
    try:
        a=1/0
    except ZeroDivisionError:
        print("发生异常后的处理")
        return 2
    finally:
        print("finally")
        return 4

print(fun())

这里写图片描述
即使在except中return 2,但是finally是一定会最后执行的,所有fun()的返回值为4。

      try except 语句还有一个else子句。不过else子句必须放在所有的except语句后面。并且只有没有发生异常时else中的代码块才会执行。

try:
    #可能会产生异常的语句块

except 异常1#捕获异常后的处理

else:
    #没有任何异常时的处理

抛出异常

Python 使用 raise 语句抛出一个指定的异常。
语法规则:

try:
    #可能会产生异常的语句块

except 异常1#捕获异常后的处理

except:
    #捕获到未知的异常,将它抛出
    raise

用户自定义异常

      除了使用系统自带的异常类型,我们也可以定义自己的异常类型。异常类继承自 Exception 类。

class MyError(Exception):
    pass

class MyError2(MyError):
    pass

当创建一个模块有可能抛出多种不同的异常时,一种通常的做法是为这个包建立一个基础异常类,然后基于这个基础类为不同的错误情况创建不同的子类:

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """

    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.

    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """

    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

(来源:http://www.runoob.com/python3/python3-errors-execptions.html)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:上身试试 返回首页