Python 获取异常(try…exception)信息
在编程过程中,我们经常会遇到各种错误和异常情况。对于这些异常,我们希望能够获取到错误信息,以便后续处理。Python 提供了异常处理机制来捕获和处理这些异常,并获取异常信息。本文将详细介绍如何使用 try...except
语句来获取异常信息,并提供一些常见的异常处理示例。
什么是异常?
在 Python 中,异常指的是程序运行时发生的一些错误或不正常的情况。当程序无法执行或者产生意外结果时,Python 会触发异常并中止程序的执行。常见的异常包括 ZeroDivisionError
、IndexError
、FileNotFoundError
、TypeError
等。
try...except
语句
try...except
语句是异常处理的核心机制。它的基本语法结构如下:
try:
# 可能引发异常的代码块
pass
except ExceptionType1:
# 异常类型1的处理代码
pass
except ExceptionType2:
# 异常类型2的处理代码
pass
else:
# 当没有异常发生时执行的代码
pass
finally:
# 无论是否发生异常,都会执行的代码
pass
try
代码块中放置可能会引发异常的代码,如果在执行try
代码块时发生异常,程序将跳转到except
代码块。try
代码块中的代码被称为 受保护的代码,因为它们受到了异常处理机制的保护。- 在
except
代码块中,可以使用一种或多种异常类型来捕获和处理异常。多个except
代码块可以用于处理不同类型的异常。 - 当异常被捕获时,程序将跳过剩余的
except
代码块,然后继续执行紧随try
语句的后续代码。 - 如果没有异常发生,将执行
else
代码块。 finally
代码块中的代码无论是否发生异常都会被执行。
下面通过几个示例来演示 try...except
的用法。
示例 1:捕获异常并输出异常类型和异常信息
try:
num1 = int(input("请输入一个整数:"))
num2 = int(input("请输入另一个整数:"))
result = num1 / num2
print(f"{num1} 除以 {num2} 的结果为:{result}")
except ZeroDivisionError as e:
print("除数不能为零!")
print(f"异常信息:{e}")
except ValueError as e:
print("输入的值必须为整数!")
print(f"异常信息:{e}")
else:
print("没有发生异常")
finally:
print("程序执行完毕")
运行结果:
请输入一个整数:10
请输入另一个整数:0
除数不能为零!
异常信息:division by zero
程序执行完毕
示例 2:捕获多个异常类型
try:
num = int(input("请输入一个整数:"))
print(f"输入的数值为:{num}")
result = 10 / num
print(f"10 除以 {num} 的结果为:{result}")
except (ZeroDivisionError, ValueError) as e:
print("输入的值无效!")
print(f"异常类型:{type(e).__name__},异常信息:{e}")
else:
print("没有发生异常")
finally:
print("程序执行完毕")
运行结果:
请输入一个整数:abc
输入的值无效!
异常类型:ValueError,异常信息:invalid literal for int() with base 10: 'abc'
程序执行完毕
示例 3:处理未知异常类型
在实际编程中,我们无法预知可能发生的所有异常类型,可以使用 Exception
类来捕获未知的异常类型。
try:
num = int(input("请输入一个整数:"))
result = 10 / num
print(f"10 除以 {num} 的结果为:{result}")
except Exception as e:
print("发生异常!")
print(f"异常类型:{type(e).__name__},异常信息:{e}")
else:
print("没有发生异常")
finally:
print("程序执行完毕")
运行结果:
请输入一个整数:0
发生异常!
异常类型:ZeroDivisionError,异常信息:division by zero
程序执行完毕
获取异常信息
在 except
代码块中,除了输出异常信息外,我们还可以使用 sys
模块中的 exc_info()
函数来获取更详细的异常信息。
import sys
try:
num1 = int(input("请输入一个整数:"))
num2 = int(input("请输入另一个整数:"))
result = num1 / num2
print(f"{num1} 除以 {num2} 的结果为:{result}")
except ZeroDivisionError as e:
print("除数不能为零!")
print("异常信息:", sys.exc_info())
except ValueError as e:
print("输入的值必须为整数!")
print("异常信息:", sys.exc_info())
else:
print("没有发生异常")
finally:
print("程序执行完毕")
运行结果:
请输入一个整数:10
请输入另一个整数:0
除数不能为零!
异常信息: (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x7faaa6fb9d80>)
程序执行完毕
sys.exc_info()
函数返回一个包含三个元素的元组,分别是异常类型、异常实例和异常发生时的追踪信息。
结语
通过使用 try...except
语句,我们可以捕获和处理 Python 程序中的异常,从而避免程序的崩溃。同时,我们还可以获取异常信息,方便我们进行调试和错误定位。合理利用异常处理机制,可以使我们的程序更加健壮和可靠。