2012-03-10 106 views
0

我有一個ruby腳本,通過縮短的URL(每次大約2,000 - 3,000)列表循環。目前一切都很好,直到遇到格式不正確的URL,超時等。當發生錯誤時,我的腳本死亡。如果發生此類錯誤,我如何設置我的循環以跳至下一個記錄。Ruby中的異常在循環中

我的循環看起來像這樣:

blah.foo do |barurl| 
    mymethod(barurl) 

我的MyMethod看起來是這樣的:

def mymethod(barurl) 
    begin 
    stuff 
    ... 
    return expandedurl 
    rescue 
    return "Problem expanding link" 
    end 
end 

如果我開始/結束邏輯在我的循環,而不是方法包裹?

回答

9

設置你的循環中跳過因爲你需要跳過不正確的網址,你應該使用異常消息來控制循環

blah.foo do |barurl| 
    begin 
    mymethod(barurl) 
    rescue YourTypeOfException 
    next 
    end 
end 

和方法內拋出異常

def mymethod(barurl) 
    stuff 
    ... 
    raise YourTypeOfException, "this url is not valid" 
    ... 
end 
1

是的。您的所有方法都會消耗該異常並返回另一個任意對象以指示錯誤。

你的方法不應該處理它自己的特殊情況。對於調用者將如何反應做出假設是不禮貌的。

blah.foo do |url| 
    begin 
    my_method url 
    rescue 
    next 
    end 
end 

是否跳到下一個URL或打印的消息是不是方法應該作出決定。它唯一關心的問題應該是使用URL。有了這個說法,你應該簡單地讓它傳播,並且只有在你能夠真正處理它時才從它中解救出來。如果您所能做的只是返回:timeout,請不要從TimeoutError中解救出來。

當您需要清理資源或者讓用戶知道發生錯誤時,請執行救援。

另外,從每一個可能的錯誤中拯救出來,讓它們消失是一個引入錯誤的好方法。要儘可能具體。

+0

^h毫米 - 感謝馬修斯的回答 - 但是......我認爲你的回答與戴夫和keymone都不矛盾?也許我只是想念一些東西。 – 2012-03-10 20:15:03

1

它應該是裏面的這個循環,所以循環結構不會退出例外。但它看起來已經是 - 如果你在導致異常的方法內部進行搶救,循環應該已經正常繼續,因爲它不應該看到異常。

+0

這就是我在想戴夫 - 但是我的循環在看到異常時打破了。我可能需要回去看看我的異常處理。 – 2012-03-10 20:13:47

+0

@EdBloom包含異常跟蹤和足夠的上下文來理解它會提供額外的幫助。假設它是一個URL,你是否按照返回值行事? – 2012-03-10 20:27:57

0

有你的方法中的異常處理是這樣做的正確方法,讓你的實現是好的

我只能點些紅寶石糖的語法時纔給你:

def some_method 
    # here goes the code 
rescue Exception => e 
    # here goes specific exception/error handling 
rescue 
    # here goes error handling (not Exception handling though!) 
else 
    # this block is kind of like previous, just for semantics 
ensure 
    # this is to be executed after method and exception handling bodies 
end 

順便說一句,你不需要return語句,代碼塊的最後的值總是返回隱含

我想啊我誤解你的問題在「如何跳過下一條記錄」

,如果你想跳過記錄當前一個是不正確的,你必須從你的分析方法會返回錯誤代碼,並使用breaknext關鍵字

+0

感謝提示re:返回語句keymone – 2012-03-10 20:12:40