📜  如何在列表理解中处理Python异常?

📅  最后修改于: 2022-05-13 01:55:47.832000             🧑  作者: Mango

如何在列表理解中处理Python异常?

异常是中断程序流程的东西。这些异常会停止进程运行并发出错误消息。异常可以简单地看作是一个代表错误的对象。 Python中有预定义的异常和用户定义的异常。在本文中,我们将讨论如何在列表推导中处理Python异常,但让我们首先了解什么是列表推导。

Python中的列表理解

列表推导式用于从现有列表或Python中的任何其他可迭代项创建新列表。一个迭代中的元素被迭代,如果需要,检查某些条件,如果它满足指定的条件,它将被添加到新的迭代中。

句法:

new_list=[variable_name    ]

在Python中,没有特殊的内置方法来处理列表推导中发生的异常。本文包含可用于处理列表推导中引发的异常的代码片段。

预定义异常处理

让我们看看列表理解中的一些预定义异常处理。

1) 处理 ZeroDivisionError

考虑两个包含整数的列表 (list1, list2)。现在需要通过将 list1 元素除以 list2 元素来形成一个新列表 (list3)。它可以如下公式化。

list3 [i] = list1 [i] / list2 [i]

在将元素除以 0 时,会引发错误。应捕获此异常并显示错误消息。这可以通过编写如下代码片段中给出的实用函数来实现。

Python3
list1 = [2, 6, 41, 1, 58, 33, -7, 90]
list2 = [1, 3, 2, 0, 6, 3, 7, 0]
  
  
def util_func(a, b):
    try:
        return round(a/b, 3)
    except ZeroDivisionError as e:
        print("Division by zero not permitted!!!")
  
  
list3 = [util_func(x, y) for x, y in zip(list1, list2)]
  
print(list3)


Python3
li = ['10', '11', 7, 'abc', 'cats', 3, '5']
  
# helper function
def util_func(a):
    try:
        return int(a)*int(a)
    except ValueError:
        pass
  
  
# list comprehension
new_li = [util_func(x) for x in li]
  
print(new_li)


Python3
# 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
li = [2, 43, 56, -78, 12, 51, -29, 17, -24]
  
# list comprehension to choose numbers
# divisible by 2
new_li = [util_func(x) for x in li]
  
print("\nThe new list has :", new_li)


Python3
# class for user-defined exception handling
class error(Exception):
    def __init__(self, a):
        self.msg = "The number "+str(a)+" is not in 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
li = [11, 16, 43, 89, 10, 14, 1, 43, 12, 21]
  
# list comprehension to choose numbers
# in range 10 to 20
new_li = [util_func(x) for x in li]
  
print("\nThe new list has :", new_li)


输出:

Division by zero not permitted!!!
Division by zero not permitted!!!
[2.0, 2.0, 20.5, None, 9.667, 11.0, -1.0, None]

在这种情况下,会打印一条自定义错误消息。

2)处理ValueError

考虑一个包含整数、字符串格式的整数以及放在一起的单词的列表。现在需要通过单独获取数字(以字符串和 int 格式)并将它们平方来形成一个新列表。但是这里的字符串值只需要跳过并且不需要打印错误消息。

Python3

li = ['10', '11', 7, 'abc', 'cats', 3, '5']
  
# helper function
def util_func(a):
    try:
        return int(a)*int(a)
    except ValueError:
        pass
  
  
# list comprehension
new_li = [util_func(x) for x in li]
  
print(new_li)

输出:

[100, 121, 49, None, None, 9, 25]

由于我们只是想忽略非数字值,因此我们没有收到任何异常消息,并且在引发异常的地方填充了None值。

用户定义的异常处理

用户定义的异常可以是任何值,例如值应该在指定范围内,或者值应该可以被某个数字整除或其他任何值。为此,必须构造一个继承内置 Exception 类的类。然后可以使用辅助函数检查异常。考虑以下示例。

示例 1:考虑一个整数列表 [2,43,56,-78,12,51,-29,17,-24]。任务是挑选出能被 2 整除的整数并形成一个新列表。对于不可整除的数字,该数字应打印错误消息

Python3

# 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
li = [2, 43, 56, -78, 12, 51, -29, 17, -24]
  
# list comprehension to choose numbers
# divisible by 2
new_li = [util_func(x) for x in li]
  
print("\nThe new list has :", new_li)

输出:

示例 2:从现有列表中形成一个新列表,使所选值介于 10 到 20 之间。

Python3

# class for user-defined exception handling
class error(Exception):
    def __init__(self, a):
        self.msg = "The number "+str(a)+" is not in 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
li = [11, 16, 43, 89, 10, 14, 1, 43, 12, 21]
  
# list comprehension to choose numbers
# in range 10 to 20
new_li = [util_func(x) for x in li]
  
print("\nThe new list has :", new_li)

输出:

The number 43 is not in range!!!
The number 89 is not in range!!!
The number 1 is not in range!!!
The number 43 is not in range!!!
The number 21 is not in range!!!

The new list has : [11, 16, 0, 0, 10, 14, 0, 0, 12, 0]