2015-12-11 105 views
-1

我正在從事一個Python項目以從各種外部來源中抓取數據。除了幾個實例化一些對象並調用幾個方法的腳本之外,所有東西都是面向對象的。所以所有的邏輯都在不同的類中。 我真的沒有任何具體的代碼來說明我的觀點。返回錯誤而不是拋出錯誤的設計模式

基本上我有一個函數,試圖抓取一個URL,如果成功返回數據,否則返回false。 來自此的返回值被另一個函數saveData()用於將數據保存到文件。如果刮擦失敗並返回false,則saveData()返回false。然後這會傳遞下去,並讓它繼續前進。

原因scrape()返回false而不是拋出錯誤是我將在腳本中使用它來刮掉很多URL,並且我不希望它由於一個錯誤的URL而死掉。

我不太喜歡這個「滴流」效應的想法,我必須一直檢查一個錯誤的值,以避免錯誤。

理想的解決方案是停止處理該URL,一旦它無法抓取它。我覺得這是一種常見的情況,可能有一些設計模式可以避免它?

也許這對於SO來說太抽象了。

+0

這絕對不是一個答案,但我已經與(HTTPS [Python實現TRY樣類的想法]最近玩過:// github.com/zero323/tryingsnake)。也許你會發現它有幫助。 – zero323

回答

0

如果我明白你的問題,那就是找到一個乾淨的方式,以便在抓取URL失敗時提前退出。在這種情況下,我會用filtermap一個前哨值:

# only used if in python 2 
from future_builtins import map, filter 

# just make sure your sentinal is a value that cannot be possibly considered valid 
_sentinal = None 
def scrape(url): 
    try: 
     return attempt_scrape(url) 
    except Exception: 
     return _sentinal 

url_data = map(scrape, sequence_of_urls) 
good_scrapes = filter(lambda v: v is not _sentinal, url_data) # only return the values we want 
saved = map(saveData, good_scrapes) 

# force running the chained iterators now 
for s in saved: 
    pass