乐趣区

关于人工智能:25-错误处理与异常

接下来咱们将学习 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 中解决异样。如果你有任何问题,请随时发问。
举荐浏览:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

退出移动版