Python异常捕获与处理

Exception

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import os
import PyPDF2
import docx

class DocumentReader:
@staticmethod
def read_pdf(file_path):
try:
with open(file_path, 'rb') as file:
reader = PyPDF2.PdfReader(file)
text = ""
for page in reader.pages:
text += page.extract_text()
return text
except Exception as e:
print(f"读取PDF文件时出错: {e}")
return ""
  • 在这里的Exception:
    • Exception 是 Python 中所有内建异常的基类。当你使用 except Exception as e 时,它意味着捕获任何类型的异常,并将异常对象赋值给变量 e
    • 在这个代码块中,try 块尝试打开 PDF文件并读取其段落文本。如果在这个过程中发生任何问题,比如文件不存在、文件损坏或者权限不足等,都会引发异常。except 块捕获这些异常后,会执行其中的代码。

return

还是以上面的Exception实例代码为例:

如果Exception异常处理代码这里没有使用return,当出现异常时,程序可能会停止运行,而使用return可以避免这种情况,以下是具体分析:

return时异常的影响

  • 向上传播异常:当在read_docx函数中发生异常且没有使用return语句来处理时,异常会向上传播到调用read_docx函数的地方。如果调用者没有进一步处理该异常,异常会继续向上传播,直到到达 Python 解释器的顶层,导致整个程序崩溃,并在控制台输出异常信息。
  • 程序执行中断:在异常传播的过程中,程序的执行会在抛出异常的位置中断,函数中异常发生点之后的代码将不会被执行。如果read_docx函数是在一个更复杂的程序流程中,比如在一个循环中读取多个文件,那么一旦出现异常,整个循环可能会终止,无法继续处理后续的文件。

使用return的作用

  • 捕获并处理异常:使用return语句在except块中,可以捕获异常并返回一个特定的值(如空字符串),从而阻止异常继续向上传播。这样,程序可以继续执行调用read_docx函数之后的代码,而不会因为异常而中断整个程序的运行。
  • 提供默认值或占位符:返回空字符串相当于提供了一个默认值或占位符,表示文件读取操作出现了问题,但程序可以继续执行下去,并根据这个返回值进行相应的处理。这使得程序具有更好的容错性和稳定性,能够在一定程度上处理各种可能出现的错误情况,而不是遇到问题就直接崩溃。
  • 和php一样,return 语句加空字符串同样会终止它所处的函数代码块的运行.

try-except-finally之间的联动:

tryexceptfinally 运行机制

  1. trytry 块中包含可能会引发异常的代码。当程序执行到 try 块时,会逐行执行其中的代码。如果在执行过程中没有发生异常,try 块中的代码会正常执行完毕,然后跳过 except 块(如果有),继续执行 finally 块(如果有)之后的代码。
  2. except:如果在 try 块中发生了异常,程序会立即停止执行 try 块中剩余的代码,并跳转到与之匹配的 except 块中执行。except 块用于捕获并处理异常,可以在其中进行错误处理,例如打印错误信息、进行数据回滚等。如果有多个 except 块,可以根据异常的类型来选择执行哪个 except 块。
  3. finallyfinally 块是可选的,但如果存在,无论 try 块中是否发生异常,也无论 except 块是否被执行,finally 块中的代码都会在 tryexcept 块执行完毕后被执行。finally 块通常用于释放资源,如关闭文件、关闭数据库连接等,确保资源的正确清理和管理。

通过合理使用 tryexceptfinally,可以使程序更加健壮,能够更好地处理运行过程中可能出现的异常情况,并保证资源的正确使用和释放。