Python异常处理机制详解:从基础到实战

Miles
Miles
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python异常处理机制,介绍NameError、TypeError等常见异常对象。通过ZeroDivisionError和FileNotFoundError实例,演示try-except-else代码块的使用,以及如何利用pass语句静默失败。掌握异常处理可编写更健壮的程序,避免程序因无效输入或资源缺失而崩溃。

什么是异常处理

在Python编程中,异常处理主要涉及对程序运行时报错信息的捕获与应对。常见的异常类型包括NameError、TypeError和ValueError等,它们统称为异常。

异常是程序执行过程中发生的事件,会干扰程序的正常流程。通常情况下,当Python无法处理某种程序状态时,便会抛出异常。异常在Python中表现为一个对象,用于标识具体的错误。若脚本运行中出现异常且未被捕获处理,程序将直接终止执行。

Python通过一种名为“异常”的特殊对象来管理程序执行期间发生的错误。每当遇到让Python无法处理的错误时,系统会自动创建一个异常对象。如果开发者编写了相应的处理代码,程序将继续运行;若未处理异常,程序将停止,并输出包含错误报告的traceback(回溯)。处理异常的标准方式是使用try-except代码块。该结构允许Python执行特定操作,并指定发生异常时的应对策略。使用try-except后,即使出现异常,程序也不会崩溃,而是显示开发者预设的友好错误提示,而非令人困惑的技术回溯信息。

处理ZeroDivisionError异常

首先看一个导致Python抛出异常的简单示例。虽然常识告诉我们数字不能除以0,但我们可以尝试让Python执行此操作:

print(5/0)

报错:

Traceback (most recent call last): File "test.py", line 2, in <module> print(5/0) ZeroDivisionError: integer division or modulo by zero

使用 try-except 代码块

当预见到可能出错时,可以使用try-except代码块来捕获并处理潜在异常。其逻辑是:让Python尝试执行一段代码,若该代码引发指定异常,则执行预设的补救措施。

处理ZeroDivisionError异常的try-except代码块示例如下:

try:
  print(5/0)
except ZeroDivisionError:
  print("You can't divide by zero!")

# You can't divide by zero!

如果在try-except代码块后还有其他代码,程序会继续执行后续逻辑,因为已经明确了该特定错误的处理方式。

使用异常避免崩溃

当程序发生错误且尚有未完成任务时,妥善的错误处理尤为重要。这在需要用户输入的程序中尤为常见:如果程序能妥善处理无效输入,即可提示用户重新输入有效值,而不会导致程序崩溃。

下面创建一个仅执行除法运算的简单计算器示例:

print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
  first_number = input("\nFirst number: ")
  if first_number == 'q':
    break
  second_number = input("Second number: ")
  try:
    answer = int(first_number) / int(second_number)
  except ZeroDivisionError:
    print("You can't divide by 0!")
  else:
    print(answer)

try-except-else代码块的工作原理大致如下:

Python会尝试执行try代码块中的代码;原则上,只有可能引发异常的代码才应放入try语句中。若有些代码仅在try块成功执行时才需运行,这些代码应置于else代码块中。except代码块的作用是:当try块引发指定异常时,告知Python执行何种操作。

通过预判可能出错的代码段,可以构建更健壮的程序。这类程序即使在面对无效数据或缺少资源时也能继续运行,从而有效抵御无意的用户错误或潜在的恶意攻击。

处理 FileNotFoundError 异常

FileNotFoundError错误通常由函数open()引发。因此,处理此错误时,必须将try语句置于包含open()调用的代码行之上:

filename = 'alice.txt'
try:
  with open(filename) as f_obj:
    contents = f_obj.read()
except FileNotFoundError:
  msg = "Sorry, the file " + filename + " does not exist."
  print(msg)

处理多个文件

def count_words(filename):
  """ 计算一个文件大致包含多少个单词 """
  try:
    with open(filename) as f_obj:
      contents = f_obj.read()
  except FileNotFoundError:
    msg = "Sorry, the file " + filename + " does not exist."
    print(msg)
  else:
    # 计算文件大致包含多少个单词
    words = contents.split()
    num_words = len(words)
    print("The file " + filename + " has about " + str(num_words) + " words.")

filenames = ['a.txt', 'b.txt', 'c.txt', 'd.txt']
for filename in filenames:
  count_words(filename)

异常时保持静默

若希望程序在失败时不输出任何信息,可像往常一样编写try代码块,但在except代码块中明确指示Python不执行任何操作。Python提供了pass语句,可在代码块中使用它来让Python什么都不做:

def count_words(filename):
  """ 计算一个文件大致包含多少个单词 """
  try:
    with open(filename) as f_obj:
      contents = f_obj.read()
  except FileNotFoundError:
    pass

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。