如何在列表推導式中捕獲 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 異常語句可用於在程式中引發異常。引發異常會終止當前程式碼執行並返回異常,直到對其進行處理。

處理內建異常

讓我們看看列表推導式中的一些內建異常處理。

示例

由於我們正在使用列表,讓我們嘗試將一個列表的元素除以另一個列表的元素。這些列表還可以包含零。

當有限數除以零時,會丟擲 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 中的一個異常,當傳遞給函式的引數資料型別正確但值無效時引發。例如,將負整數傳遞給嘗試查詢數字平方根的函式。

考慮一個包含整數、字串格式的整數和單詞的列表。現在必須透過對數字(以字串和 int 格式表示)進行平方來建立一個新列表。但是,在這種情況下,字串值必須簡單地跳過,並且不發出錯誤通知。

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 類的類。然後可以使用幫助程式函式測試異常。請考慮以下示例。

示例

考慮一個整數列表。目標是挑選出可被二整除的整數並形成一個新列表。對於不可整除的數字,應列印數字及其錯誤訊息。

# 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]

更新於:2023 年 4 月 4 日

2K+ 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告