不try一下怎麼知道行不行?Python提倡最瀟灑的防禦性程式碼風格 : EAFP

更新 發佈閱讀 4 分鐘
對於處理主要業務邏輯的程式碼來說,判斷錯誤、處理異常的程式碼屬於"防禦性程式碼"。而EAFP、LBYL是兩種截然不同的防禦型程式碼撰寫風格。
raw-image


EAFP的全名是Easier to Ask for Forgiveness than Permission,是 Python 提倡的防禦型程式碼風格,鼓勵工程師直接編寫主要業務邏輯,不需要在執行主要邏輯前多做異常及錯誤的檢查,真的發生再處理就好。

EAFP風格的防禦性程式碼

user = {"name": "馬斯克"}

try:
send_email(user["email"])
send_sms(user["mobile"])

except KeyError:
print("Key is not exist"

從這段 Python 程式碼可以看到,我們在存取 user 字典前,不事先使用if判斷要存取的 key 是否存在於字典中,直接執行主要業務邏輯(send_email、send_sms),將所有key相關的錯誤丟到 except 區塊統一處理。


我們再來看看另一種防禦性程式碼風格: LBYL(Look Before You Leap),這種風格的程式碼要求工程師在撰寫主要業務邏輯之前,必須想清楚可能的錯誤並預先排除。

LBYL風格的防禦性程式碼

user = {"name": "馬斯克"}

if user.get("email"):
send_email(user["email"])
else:
print("Key is not exist: email")

if user.get("mobile"):
send_sms(user["mobile"])
else:
print("Key is not exist: mobile")

LBYL 的程式碼風格則是與上面這段程式碼類似,先用 if 確定 key 確實存在 user 字典裡,才取出需要的 user 資料執行主要業務邏輯(send_email、send_sms)。


兩種風格的比較

程式碼可讀性 : EAFP優於LBYL

EAFP 風格的程式碼主要業務邏輯與防禦型程式碼分離,程式碼清晰、可讀性較佳,工程師較容易專注處理主要業務邏輯。

程式碼執行效率 : EAFP等於LBYL

EAFP 風格的程式碼在異常狀況發生時,try/except 相關的 call stack 處理是比 if 慢的,但是只有發生異常時要處理。

相反的 LBYL 不管有沒有發生異常,都要花費固定成本執行 if 一次。因此在效率上可以說是不相上下。

多進程/多線程場景 : EAFP優於LBYL

if user.get("email"): 
# 假如發生 context switch, user的email被其他process刪除
send_email(user["email"])
else:
print("Key is not exist: email")

如果程式碼是運行在 Multi-process 或是 Multi-thread 等非同步場景之下,極有可能在if 敘述執行後發生 Context Switch,這個狀況下通過前一行 if 敘述的檢查並無法保證接下來一定可以存取到對應的資料。

這種狀況下 LBYL 風格的if檢查敘述必須搭配鎖相關的原子操作的機制才能發揮原本的檢查效果,而 EAFP 的 try/except 本身就已經涵蓋了這種狀況。


結論

Python 作為動態型別的程式語言,配合其完善的異常處理系統,強烈鼓勵開發者採用 EAFP風格編寫防禦性程式碼。

此外,在涉及多進程或多線程的應用場景中,採用 EAFP 風格的防禦性程式碼不僅提升了程式碼的可讀性,還能有效應對非同步操作中可能出現的問題,帶來實質的效益。

留言
avatar-img
留言分享你的想法!
avatar-img
再寫5分鐘
67會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
再寫5分鐘的其他內容
2024/07/02
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
2024/07/02
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
2024/07/02
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
2024/07/02
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
2024/06/15
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
Thumbnail
2024/06/15
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
本章節的目的是介紹在TypeScript中如何進行例外處理。涵蓋了例外處理的重要性、語法、常見異常類型以及如何主動觸發異常訊息及用戶自定義異常訊息。為讀者提供了全面而深入的了解,以提高程式的可靠性、提供更好的反饋、增加程式的容錯性以及改善程式的可讀性。
Thumbnail
EAFP(Easier to Ask for Forgiveness than Permission)是Python提倡的防禦性程式碼風格,鼓勵工程師直接撰寫主要業務邏輯,不需要多做檢查,真的出現異常再處理就好。這種風格的程式碼可讀性優於LBYL風格,並且在多進程/多線程場景下表現更好。
Thumbnail
EAFP(Easier to Ask for Forgiveness than Permission)是Python提倡的防禦性程式碼風格,鼓勵工程師直接撰寫主要業務邏輯,不需要多做檢查,真的出現異常再處理就好。這種風格的程式碼可讀性優於LBYL風格,並且在多進程/多線程場景下表現更好。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
當你在開發程式時,難免會遇到各種錯誤和異常情況。這些錯誤可能是因為代碼中的錯誤、外部資源無法訪問或其他不可預期的狀況。為了提高程式的可靠性、穩定性和可維護性,我們使用「例外處理」來處理這些異常情況。
Thumbnail
例外處理是Python中的重要概念,用於控制並處理程序異常,防止程序崩潰和數據損失。它包括try, except, else和finally等語法結構,可用於對特定錯誤進行處理,或主動觸發和自定義異常。
Thumbnail
例外處理是Python中的重要概念,用於控制並處理程序異常,防止程序崩潰和數據損失。它包括try, except, else和finally等語法結構,可用於對特定錯誤進行處理,或主動觸發和自定義異常。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News