首页 >后端开发 >Python教程 >Python 中的错误处理:最佳实践。探索如何有效处理异常

Python 中的错误处理:最佳实践。探索如何有效处理异常

Patricia Arquette
Patricia Arquette原创
2025-01-12 22:09:43786浏览

Error Handling in Python: Best Practices. Explore how to handle exceptions effectively

摘要:

程序错误是不可恢复的;当程序遇到错误时,它会立即退出或崩溃。

优秀的程序员会确保他们的代码或软件能够优雅地处理软件使用过程中可能出现的错误/异常,而不会崩溃或产生不良结果。想象一下,为金融机构编写仅接受数字输入的软件,如果用户输入了字母而不是数字进行算术运算,这通常会引发错误,并且软件会因为一个用户而崩溃,如果没有任何适当的机制来处理错误的话。这绝对不是一件好事——它对业务不利,可能导致客户感到沮丧,而且有人可能会因为不称职而丢掉工作。

在本文中,我们将学习如何以最佳方式处理代码中由于用户交互而可能出现的错误。敬请关注。

先决条件

本文适合:

  • 寻求学习如何在代码中处理异常的 Python 软件开发人员。
  • 已经熟悉 Python 并希望学习 Python 中错误处理概念的人员。
  • 寻求提高 Python 错误处理知识的现有专业人士。

目标

通读本文后,读者应该能够:

  • 清晰地理解 Python 中错误处理的概念及其重要性。
  • 了解自定义异常类以及如何实现它们。
  • 理解 Python 中错误和异常之间的关键区别。

解释错误和异常

错误异常通常可以互换使用,但它们在技术上含义不同。在 Python 中,错误异常都是BaseException的子类,这进一步表明它们即使不同,也有一些共同点。

错误

错误是不可恢复的;当我们的程序遇到错误时,它会立即退出或崩溃。即使您可能预料到错误,也没有办法以编程方式处理错误。下面列出了一些错误:

SyntaxError

这是程序员面临的最常见错误类型之一,它发生在代码不遵循正确的 Python 语法时,并且可以在解析期间检测到。对于学习者或从其他编程语言转向 Python 的人来说,这是一个很容易出现的问题。

<code class="language-python">name = “Austin”;
print(name)</code>

这会导致 SyntaxError,因为在 Python 中,语句不会以分号结尾。

IndentationError

当 Python 代码缩进不正确时,就会发生此错误,并在解析代码时检测到。Python 中的缩进非常重要。它是 Python 中唯一可以定义代码块的方式,这与大多数使用花括号的语言不同。

<code class="language-python">name = “Austin”;
print(name)</code>

这段代码会因为缩进不当而导致错误。它应该是:

<code class="language-python">active = True
if (active):
print(“The user is active”)</code>

异常

Python 中的异常在运行时发生。与错误不同,可以以编程方式正确地处理或捕获它们,以便我们的程序可以继续运行而不会崩溃。换句话说,它们是可恢复的。以下是 Python 中一些常见的异常:

内置异常

这些类型的异常是 Python 编程语言的一部分。下面列出其中一些:

ValueError

当向函数传递无效参数时发生此错误,即使类型可能正确。

<code class="language-python">if (active):
    print(“The user is active”)</code>

从上面的代码片段中,如果我们向函数传递数字字符串,它将成功转换为数字,否则,它将产生 ValueError

<code class="language-python">def str_num(num_string):
    return(int(string))</code>

TypeError

当向函数传递不合适的类型参数时,就会引发此错误。

<code class="language-python">print(str_num(“123”)) #works perfectly
print(str_num(“abc”)) #raises a ValueError</code>

这会引发 TypeError

IndexError

当您尝试使用错误索引访问列表中的值时,就会出现此错误。

<code class="language-python">def addition(num1, num2):
    return num1 + num2
# calling the function
addition(5, A)</code>

这会导致 IndexError,因为 my_list[2] 无法访问。

KeyError

当尝试使用错误或不存在的键访问字典中的值时,就会引发此错误。

<code class="language-python">my_list = [“dog”, “cat”]
my_list[2]</code>

这会引发 KeyError。 您可以在此处找到其他内置异常。

自定义异常

自定义异常由程序员定义。在这里,Python 使程序员能够手动定义程序应该在执行期间检查的条件,并在找到时引发异常。您可以通过创建一个从 Exception 类继承的类来实现这一点。

处理异常

处理异常可确保我们的软件应用程序在遇到应用程序生命周期中出现的某些错误时具有可预测的性能。在本节中,您将学习如何在编程中实现这一点。

使用 try-except 语句

try-except 语句提供了一种安全的方法来处理可能引发错误或异常的代码。try 语句包装有问题的代码或 try 子句;这是很可能导致整个程序出错的代码部分;当从用户那里接收输入、从文件读取时,这很可能会发生,仅举几例。

except 语句标志着 except 子句的开始;这是包装在 except 块中的其余代码。except 子句处理 try 块中引发的异常。

让我带您了解执行工作流程。您的 Python 程序通常会执行,直到它到达包含“有问题的”代码的 try 块,如果当时在 try 块中执行代码时没有可能的错误,它会跳过 except 块并继续执行代码库的其余部分。但是,如果在 try 块中执行代码时遇到错误,则会在创建异常对象后,控制立即跳转到 except 块,在该块中,它应该由匹配的异常类处理。

<code class="language-python">name = “Austin”;
print(name)</code>

从上面的代码片段中,如果将非数值传递给程序,则会创建异常对象并引发 ValueError。控制立即跳转到 except 块,在该块中它会扫描合适的异常类。在这里,ValueError 类就足够了。错误已得到正确处理。但是,如果找不到正确的类,则控制会移动到外部 try 块(如果有的话),如果仍然没有正确处理异常,则程序会崩溃。

使用一个 except 语句处理多个异常类

可以检查多个异常类并处理特定异常。如果您不确定几个异常中的哪一个会导致代码执行结果,则首选这种方法。请参见下面的代码片段。

<code class="language-python">active = True
if (active):
print(“The user is active”)</code>

通配符异常类

Exception 类是 BaseException 的直接子类。Exception 类是所有非致命异常的基类。

大多数情况下,Exception 类足以处理代码执行期间引发的多数异常。

<code class="language-python">if (active):
    print(“The user is active”)</code>

即使 Exception 类能够处理非致命异常,最好还是谨慎使用它。使用正确的 Exception 类,因为它更有利于调试和提高代码的可读性。

使用 finally 语句

包装在 finally 块中的代码部分无论是否发生异常都会执行。这使得它适合处理清理任务;关闭文件和释放内存资源。

<code class="language-python">def str_num(num_string):
    return(int(string))</code>

创建自定义异常类

创建自定义异常使程序员能够为软件程序提出特定的异常。这可能包含可能对特定软件程序的功能有害的特殊条件或极端情况。定义的自定义异常类必须从 Exception 类继承。

<code class="language-python">print(str_num(“123”)) #works perfectly
print(str_num(“abc”)) #raises a ValueError</code>

上面的代码片段显示了如何创建和使用自定义异常。根据用例,它可以以更复杂的方式使用。

为什么错误/异常处理很重要

“不要相信用户”是软件开发人员中常见的说法,这重申了您无法完全确定用户将如何与您的软件应用程序交互;他们输入的输入类型以及您作为程序员在编写应用程序时可能没有想到的其他一些极端情况。下面解释了正确处理错误/异常的一些重要原因:

  1. 防止崩溃 如果没有异常处理,未处理的错误可能会导致程序突然崩溃。这可能导致数据丢失或用户体验不佳。 示例: 没有异常处理:
print(10 / 0) # ZeroDivisionError: division by zero

使用异常处理:

try: print(10 / 0) except ZeroDivisionError: print("不能除以零!")

  1. 改善用户体验 正确处理的异常会提供有意义的错误消息,而不是神秘的系统错误,从而使应用程序更易于使用。 示例:
try: age = int(input("输入您的年龄:")) except ValueError: print("无效输入!请输入数字。")
  1. 保持应用程序稳定性 它允许应用程序即使在遇到错误后也能继续运行,从而确保稳定性。 示例:
def divide(a, b): try: return a / b except ZeroDivisionError: return "不允许除以零!"

print(divide(10, 2)) # 输出:5.0 print(divide(10, 0)) # 输出:不允许除以零!

  1. 处理极端情况 异常处理使您可以考虑不可预测的情况,例如网络故障、文件丢失或无效用户输入。 示例:
try: with open("data.txt", "r") as file: content = file.read() except FileNotFoundError: print("找不到该文件。")
  1. 鼓励编写简洁的代码
    通过将正常逻辑与错误处理逻辑分开,异常处理使您的代码更易于阅读、调试和维护。

  2. 促进调试
    借助详细的错误消息和异常日志,开发人员可以快速识别和修复代码中的问题。
    示例:

import logging

try: result = 10 / 0 except Exception as e: logging.error("发生错误", exc_info=True)

  1. 对于关键系统至关重要 在可靠性至关重要的系统(例如银行、医疗保健)中,异常处理对于确保安全地管理错误而不会导致数据损坏或丢失是必要的。

结论

在编程术语中,错误和异常大多数时候可以互换使用。Python 中错误和异常之间的关键区别在于它们如何影响我们的软件程序。语法错误和缩进错误等错误会在解释器解析程序时使程序崩溃。另一方面,如果未正确处理异常,则异常会在运行时使程序崩溃。自定义异常通过使程序员能够定义特定于特定软件应用程序的异常类来扩展错误处理功能。

错误处理对于调试也非常重要。它可以使我们看到应用程序中发生错误的原因,从而为软件维护人员提供足够的信息来解决问题。始终确保在代码中适当地引入异常处理,以确保软件应用程序的健壮性。

感谢您的阅读。

以上是Python 中的错误处理:最佳实践。探索如何有效处理异常的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn