Python异常处理机制详解:从基础到实战
本文深入解析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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









