如何在列表推导式中捕获Python异常
在我们了解如何在列表推导式中捕获Python异常之前,先让我们了解列表推导式是什么。
列表推导式是一种语句,它允许您在一个句子中创建一个列表并执行一个for循环。
这还允许从其他可迭代对象(如元组、字符串、数组、列表等)创建列表。列表推导式的语法如下所示:
List = [expression(element) for element in list if condition]
Python的列表和列表推导能力是该语言最具特色的两个功能之一,可以在一行代码中实现大量的功能。
在Python中,没有独特的内置方法来处理列表推导中出现的异常。因此,我们只能使用try/except块来处理。
示例
示例
letters = [letter for letter in 'APPLE']
### print(letters)
输出
['A', 'P', 'P', 'L', 'E']
列表解析中的异常处理
异常是在程序执行过程中发生的意外错误或事件。错误和异常经常被混淆为同一个概念;当程序产生错误时,程序会停止执行;但当遇到异常时,程序会偏离原本的执行路径。因此,与错误不同,异常可以被处理。因此,您的程序不会崩溃。
很多时候,异常既有有效的情况,也有无效的情况。异常在程序中以各种方式有助于管理错误和异常情况。当您认为自己的代码可能会产生错误时,您可以利用异常处理技术。
您可以使用raise exception语句在程序中引发异常。引发异常会终止当前的代码执行,并将异常返回,直到对其进行处理。
处理内置异常
让我们来看一些列表解析中的内置异常处理。
示例
由于我们正在处理列表,让我们尝试将一个列表的元素除以另一个列表的元素。这些列表也可以包含零。
当有限的数被零除时,会引发ZeroDivisionError异常。这是一种内置异常,属于ArithmeticException类的一部分。可以使用try-except块处理此异常,在引发此异常时更改输出。我们可以通过一个示例更好地理解这个概念。
list_1 = [12, 23, 34, 45, 56]
list_2 = [0, 1, 2, 3, 4]
def func(a, b):
try:
return a/b
except ZeroDivisionError:
print("Division by zero not allowed")
list_3 = [func(x, y) for x, y in zip(list_1, list_2)]
print(list_3)
输出
Division by zero not allowed
[None, 23.0, 17.0, 15.0, 14.0]
示例
ValueError 是 Python 中的一个异常,当传递给函数的参数虽然是正确的数据类型,但其值是无效的时候就会引发该异常。例如,将负整数传递给试图找到一个数的平方根的函数。
考虑一个列表,其中包含整数、以字符串格式表示的整数和单词。现在需要通过对这些数字(以字符串和整数格式)进行平方来创建一个新列表。但是,在这种情况下,字符串值必须被跳过,不发出错误提示。
list = ['10', '11', 7, 'abc', 'cats', 3, '5']
#helper function
def func(a):
try:
return int(a)*int(a)
except ValueError:
pass
# list comprehension
new_list = [func(x) for x in list]
print(new_list)
输出
由于我们只想忽略非数字值,所以我们没有收到任何异常消息,而在引发异常的地方填入了None值。
[100, 121, 49, None, None, 9, 25]
其他内置异常也可以使用try-except块以相同的方式处理。
处理自定义异常
自定义异常可以是任何内容,例如值在特定范围内或能被某个数整除。为此,必须创建一个继承内置Exception类的类。可以使用辅助函数来测试异常。请考虑下面的示例。
示例
假设有一个整数列表,目标是筛选出能被2整除的整数并形成一个新列表。对于不可被2整除的数字,应打印出错误消息。
# creating class for user-defined exception handling
class error(Exception):
def __init__(self, a):
self.msg = "The number "+str(a)+" is not divisible by 2"
# helper function
def util_func(a):
try:
if a % 2 != 0:
raise error(a)
return(a)
except error as e:
print(e.msg)
# input list
list = [12, 23, 34, 45, 56, 67]
# list comprehension to choose numbers
# divisible by 2
new_list = [util_func(x) for x in list]
print("\nThe new list has :", new_list)
输出结果
The number 23 is not divisible by 2
The number 45 is not divisible by 2
The number 67 is not divisible by 2
The new list has : [12, None, 34, None, 56, None]
示例
使用值范围在10到20之间创建一个新列表。如果值超出指定范围,我们将引发异常,如下例所示。
# class for user-defined exception handling
class error(Exception):
def __init__(self, a):
self.msg = "The num "+str(a)+" is out of range!!!"
# helper function
def util_func(a):
try:
if a < 10 or a > 20:
raise error(a)
return(a)
except error as e:
print(e.msg)
return 0
# input list
new_list = [12, 23, 34, 45, 56, 67]
# list comprehension to choose the numbers
# in range 10 to 20
new_li = [util_func(x) for x in new_list]
print("\nThe new list are:", new_list)
输出
输出 上述程序的输出如下所示 –
The num 23 is out of range!!!
The num 34 is out of range!!!
The num 45 is out of range!!!
The num 56 is out of range!!!
The num 67 is out of range!!!
The new list are: [12, 23, 34, 45, 56, 67]