Python基础教程之异常处理的方法是什么

异常

在Python中,使用异常对象(exception object)来表示代码执行过程中所发生的异常情况,当执行程序爆出错误的时候则会抛出异常。

如果没有正确处理异常,则会终止运行。

你可以想象一下,如果你在开发一款产品时,出现异常而不报告出发生异常的原因,是不是会很难受,也很难解决异常的问题。

Python基础教程之异常处理:让你的程序更稳定!

为了提高产品的稳定性与灵活性,Python运行开发者捕捉并处理各类异常,一般的内部模块报错如KeyError异常类较为常见,当然也有很多其他的。

错误与异常

简单了解下,Python将代码执行错误分为两类:语法错误(syntax error)和异常(exception)。

语法错误

首先,是语法错误的问题。字面可知,代码解析错误。

这种错误通常出现在初学者,主要原因是所执行的代码不符合Python语法的规范,故会报出语法错误导致code停机。

下面给出一个错误示范:

>
>
>
if for not in list(1,2,3,4)
File "
<
stdin>
"
, line 1
if for not in list(1,2,3,4)
^
SyntaxError: invalid syntax

从上面的报错中可以知道是语法错误,无效的语法。并且指出了错误的地方在for的位置,很显然if和for不能用在一起。

异常

异常则是在代码执行过程中发现的错误,这是很难提前被发现的,即使代码写的很规范标准,但也可能会出现执行异常的情况。

下面给出一个错误示例。在数学运算中,经常讨论的问题是除数为零的情况。然而,0作为除数是不被允许的,因为这样会导致异常情况。

>
>
>
a = 5 / 0
Traceback (most recent call last):
File "
<
stdin>
"
, line 1, in <
module>

ZeroDivisionError: division by zero

很明显报错指出0作为除数是不对的。

异常处理

当我们了解了错误和异常后,就得处理异常情况。对于语法错误这种问题多多练习即可避免,对于第二种异常,python给出了try-except语句来处理。

为了更清晰的解释,还是以上面的除数为0的情况作为例子,我们通过添加try-except语句捕捉并处理异常情况:

def division(x, y):
try:
return x / y
except ZeroDivisionError:
print("
0不能作为除数!!!"
)

然后我们再在terminal调用函数试试:

division(x=1, y=0)

输出:

0不能作为除数!!!

虽然我们的输入是错误的理论应该报错,但是并没有报错而且还返回了一段话。

下面解释一下try-except语句的工作原理:

  • Try-except中的代码会被正常执行

  • 如果没有出现异常则跳过except代码块并结束try-except

  • 如果try-except中的某一句代码出现了问题异常,剩余代码停止执行,如果出现的异常与except所指定的一致,则执行except中的代码块,异常处理结束整个应用程序继续执行

  • 如果出现的异常与except中指定的不符合,那么则跳出try语句,程序继续抛出异常并终止执行代码

  • 当然,我们所编写的代码可能会出现多种异常情况,因此我们可以将所有的异常情况写在一个except语句块中,具体实现如下:

    except (RuntimeError, TypeError, NameError):pass

    如果捕捉到异常列表中的任意一项异常表达式,则都会进入except处理。

    当然,如果你想对每一种异常进行单独处理也可以一个一个的分开进行处理:

    def passpass(x=1):
    try:
    return print(x+x)
    except (RuntimeError, TypeError, NameError):
    pass
    except TypeError:
    print('
    参数错误啦~'
    )
    except NameError:
    print('
    名称错误啦~'
    )

    今天先到这里明儿再更,去跳绳了,哎,每天卷卷卷,老北京鸡内卷啊~(2022.4.20)

    Python的异常类型是可以继承的, 我们在此仅需知道,若except后指定的异常继承自前面异常,由此后面的异常也会被捕捉到,示例如下:

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

    for cls in [A, B, C]:
    try:
    raise cls()
    except C:
    print('
    C'
    )
    except B:
    print('
    B'
    )
    except A:
    print('
    A'
    )

    则会输出:

    ABC

    相反,如果把except的顺序倒过来,则只会输出A,由于异常B和C都继承来自A,由此在捕捉到B异常后则会终止:

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

    for cls in [A, B, C]:
    try:
    raise cls()
    except A:
    print('
    A'
    )
    except B:
    print('
    B'
    )
    except C:
    print('
    C'
    )

    输出全为A:

    AAA

    如果所有异常都一一的提取出来,这会很麻烦,此时可以在最后的一个except中不设置异常类型,由此剩下没有被捕获的异常全会被捕捉:

    def passpass(x=1):
    try:
    return print(x/x)

    except TypeError:
    print('
    参数错误啦~'
    )
    except NameError:
    print('
    名称错误啦~'
    )
    except:
    print('
    报错啦~自己查'
    )

    一个重要功能:else.

    else语句则是用来执行一些额外操作,如try代码块中执行了一些文件操作,在else中可以释放资源,else的语法格式如下:

    try:
    pass
    except:
    pass
    else:
    pass

    当然我们还可以操作异常,如下:

    def passpass(x=1):
    try:
    return print(x/x)

    except TypeError as error:
    print('
    参数错误啦~'
    , error)
    except NameError:
    print('
    名称错误啦~'
    )
    except:
    print('
    报错啦~自己查'
    ) 自主抛出异常

    开发者在平常的有些情况下并没有执行错误,但是不符合设计逻辑,由此需要开发者主动抛出异常,这时我们需要使用raise语句抛出异常:

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

    NameError: HiThere 自定义异常

    Python内置异常无法满足开发需求的时候,可以自定义异常。

    自定义异常类必须要直接或间接继承自Exception类。尽管自定义异常类与其他类具有相同的功能,但为保持简洁,应该仅提高必要的属性。

    class Error(Exception):
    "
    "
    "
    Base class for exception 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 winerror

    "
    "
    "

    def __init__(self, expression, message):
    self.expression = expression
    self.message = message finally子句

    else在代码正常执行后才会被执行的代码块,但有些情况无论代码块是否出现异常都要执行,则需要用到finally语句:

    def passpass(x=1):
    try:
    return print(x/x)

    except TypeError as error:
    print('
    参数错误啦~'
    , error)
    except NameError:
    print('
    名称错误啦~'
    )
    except:
    print('
    报错啦~自己查'
    )
    finally:
    print('
    运算结束~'
    )

    Python是一种易学易用的脚本语言,但是在实际开发中经常会遇到各种问题,如未被预料到的输入、内存不足等引起的错误。这些错误可以通过异常处理来避免程序崩溃,让程序更加稳定。本文将会带您了解Python中异常处理的基础知识,在遇到问题时正确地诊断和解决。
    1.异常的种类
    在Python中,异常分为两种:内置异常和自定义异常。内置异常指Python自带的异常类型,如ZeroDivisionError、NameError等。而自定义异常则是我们自己定义的异常类型,用于抛出和处理程序中出现的特定情况。
    2.try-except语句
    Python中的异常处理主要通过try-except语句来实现。try块包含可能引发异常的语句,如果出现异常,则跳转到except块进行处理。try-except语句的基本格式如下:
    ```
    try:
    可能出现异常的语句
    except 异常类型1:
    异常处理1
    except 异常类型2:
    异常处理2
    else:
    未出现异常时的处理
    finally:
    无论是否出现异常都会执行的代码
    ```
    其中except块按照出现的异常类型进行处理,else块用于在未出现异常时执行特定的代码,finally块的代码无论是否出现异常都会被执行。
    3.抛出异常
    我们也可以手动抛出异常。对于自定义的异常,通过raise语句可以将异常抛出。语法如下:
    ```
    raise Exception(\"异常信息\")
    ```
    其中Exception可以替换为其他类型的异常,如ValueError、TypeError等。
    4.自定义异常
    为了更加清晰地抛出和处理特定情况下的异常,我们可以自定义异常类型。定义一个异常类需要继承自Exception或其子类。例如,定义一个名为MyException的异常类:
    ```
    class MyException(Exception):
    def __init__(self, message):
    super().__init__(message)
    self.message = message
    ```
    在程序中使用时,可以像使用内置异常一样使用自定义异常。
    5.assert语句
    Python还提供了assert语句来检查某个条件是否为真,如果为假则抛出AssertionError异常。assert语句的语法如下:
    ```
    assert 条件, 错误信息
    ```
    其中,条件为需要检查的表达式,如果为假则会抛出AssertionError异常,并将错误信息作为参数传递。
    6.with语句
    Python中的with语句用于简化代码块的使用,例如打开文件、访问数据库等需要清理资源的情况。with语句会在结束时自动释放资源,无论代码块是否出现异常。语法如下:
    ```
    with 资源 as 变量:
    使用资源的代码块
    ```
    例如,使用with语句读取文件:
    ```
    with open(\"file.txt\", \"r\") as f:
    data = f.read()
    ```
    在with块定义的范围内,文件会自动关闭。
    7.总结
    Python中的异常处理能够帮助我们更好地诊断和解决程序运行过程中出现的问题。在实际开发中,我们需要根据具体的情况选择合适的异常处理方式,以及考虑如何自定义异常类型,使程序更易于维护和扩展。通过本文的介绍,相信读者已经掌握了Python中异常处理的基础知识,让我们的程序更加稳定!