python中的错误处理及异常断言详解

 更新时间:2023年06月07日 10:25:51   作者:移动安全星球  
这篇文章主要为大家介绍了python中的错误处理及异常断言示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

接下来我们将学习Python中的错误处理和异常。在编写程序时,我们经常会遇到各种错误。Python使用异常(exception)来表示在程序运行时发生的错误。了解如何处理异常对编写可靠、健壮的程序至关重要。

1. 异常

异常是在程序运行过程中发生的错误事件。当Python解释器遇到错误时,它会引发一个异常。例如,访问不存在的列表元素会引发IndexError异常,而尝试除以零会引发ZeroDivisionError异常。

以下是一个抛出异常的示例:

def divide(a, b):
    return a / b
result = divide(4, 0)  # ZeroDivisionError: division by zero

在这个例子中,我们定义了一个名为divide的函数,用于执行除法运算。当我们尝试除以零时,Python会抛出ZeroDivisionError异常。

2. 异常处理

为了处理异常,我们可以使用tryexcept语句。try语句用于包裹可能引发异常的代码块,而except语句用于捕获特定类型的异常并执行相应的代码块。

以下是一个处理异常的示例:

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("Cannot divide by zero!")
        return None
result = safe_divide(4, 0)  # Cannot divide by zero!
print(result)  # None

在这个例子中,我们定义了一个名为safe_divide的函数,用于执行除法运算。我们使用try语句包裹可能引发异常的代码,并使用except语句捕获ZeroDivisionError异常。当异常发生时,我们打印一条错误消息并返回None

3. 多个except语句

我们可以使用多个except语句来处理不同类型的异常。例如:

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("Cannot divide by zero!")
        return None
    except TypeError:
        print("Invalid input!")
        return None
result = safe_divide(4, "two")  # Invalid input!
print(result)  # None

在这个例子中,我们增加了一个except语句来捕获TypeError异常。当我们尝试使用一个非数值类型作为除数时,Python会抛出TypeError异常。

4. finally语句

finally语句用于指定无论异常是否发生,都需要执行的代码块。例如:

def safe_divide(a, b):
    try:
        return a / b
    except ZeroDivisionError:
        print("Cannot divide by zero!")
        return None
    except TypeError:
        print("Invalid input!")
        return None
    finally:
        print("Finished dividing.")
result = safe_divide(4, 2)  # Finished dividing.
print(result)  # 2.0
result = safe_divide(4, 0)  # Cannot divide by zero!
                             # Finished dividing.
print(result)  # None

在这个例子中,我们使用finally语句指定了一个无论异常是否发生,都需要执行的代码块。在这种情况下,我们在每次调用safe_divide函数时都会打印"Finished dividing."。

5. 自定义异常

我们可以通过继承BaseException类或其子类来定义自定义异常。例如:

class InvalidInputError(Exception):
    pass
def safe_divide(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise InvalidInputError("Both a and b must be numbers.")
    if b == 0:
        raise ZeroDivisionError("Cannot divide by zero.")
    return a / b
try:
    result = safe_divide(4, "two")
except InvalidInputError as e:
    print(e)  # Both a and b must be numbers.

在这个例子中,我们定义了一个名为`InvalidInputError`的自定义异常类,用于表示无效的输入。我们修改了`safe_divide`函数,使其在遇到无效输入时抛出`InvalidInputError`异常。然后我们使用`try`和`except`语句捕获并处理这个异常。

6. 异常链

有时,我们可能需要在处理异常时引发新的异常。为了保留原始异常的上下文信息,我们可以使用`raise ... from ...`语句来创建异常链。例如:

```python
class ParsingError(Exception):
    pass
def parse_number(number_string):
    try:
        return int(number_string)
    except ValueError as e:
        raise ParsingError("Invalid number format.") from e
try:
    result = parse_number("12a")
except ParsingError as e:
    print(f"{e} - Original exception: {e.__cause__}")

在这个例子中,我们定义了一个名为ParsingError的自定义异常类,用于表示解析错误。我们创建了一个名为parse_number的函数,该函数尝试将字符串转换为整数。当转换失败时,我们使用raise ... from ...语句引发一个新的ParsingError异常,并保留原始ValueError异常作为上下文信息。

7. 断言

断言(assertion)是一种用于检查程序中的条件是否满足预期的调试工具。当断言条件为False时,Python会抛出一个AssertionError异常。我们可以使用assert语句来编写断言。例如:

def calculate_area(width, height):
    assert width > 0, "Width must be positive."
    assert height > 0, "Height must be positive."
    return width * height
try:
    area = calculate_area(-1, 5)
except AssertionError as e:
    print(e)  # Width must be positive.

在这个例子中,我们创建了一个名为calculate_area的函数,用于计算矩形的面积。我们使用assert语句来检查输入的宽度和高度是否为正数。当输入不满足条件时,会抛出一个AssertionError异常。

请注意,断言应仅用于调试程序和捕获非预期的错误。在生产环境中,您应该使用异常处理来处理可能的错误情况。

这就是Python中错误处理与异常的基本概念。

希望这些示例能帮助你更好地理解如何在Python中处理异常,更多关于python错误处理异常断言的资料请关注脚本之家其它相关文章!

相关文章

  • CentOS7下安装python3.6.8的教程详解

    CentOS7下安装python3.6.8的教程详解

    这篇文章主要介绍了CentOS7下安装python3.6.8的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Python中__str__()的妙用

    Python中__str__()的妙用

    本文主要介绍了Python中__str__()的妙用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • python进程间通信Queue工作过程详解

    python进程间通信Queue工作过程详解

    这篇文章主要介绍了python进程间通信Queue工作过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Python3 pip3 list 出现 DEPRECATION 警告的解决方法

    Python3 pip3 list 出现 DEPRECATION 警告的解决方法

    今天小编就为大家分享一篇Python3 pip3 list 出现 DEPRECATION 警告的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • PyTorch中clone()、detach()及相关扩展详解

    PyTorch中clone()、detach()及相关扩展详解

    这篇文章主要给大家介绍了关于PyTorch中clone()、detach()及相关扩展的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python带参数打包exe及调用方式

    python带参数打包exe及调用方式

    今天小编就为大家分享一篇python带参数打包exe及调用方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python 解决函数返回return的问题

    python 解决函数返回return的问题

    这篇文章主要介绍了python 解决函数返回return的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • python超参数优化的具体方法

    python超参数优化的具体方法

    在本篇文章里小编给大家整理了一篇关于python超参数优化的具体方法,有需要的朋友们可以学习下。
    2021-08-08
  • Python参数传递中双星号(**)和单星号(*)是作用

    Python参数传递中双星号(**)和单星号(*)是作用

    双星号(**)和单星号(*)在参数传递中扮演着关键角色,本文主要介绍了Python参数传递中双星号(**)和单星号(*)是作用,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • Python深度学习理解pytorch神经网络批量归一化

    Python深度学习理解pytorch神经网络批量归一化

    这篇文章主要是Python深度学习篇,通过示例的详解让大家更好的理解pytorch神经网络批量归一化,有需要的的朋友可以借鉴参考下,希望能够有所帮助
    2021-10-10

最新评论