接下来咱们将学习 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. 异样解决
为了解决异样,咱们能够应用 try
和except
语句。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