2009-11-04 71 views
2

偶爾在我的代碼中,我會故意使用拋出的異常作爲事件觸發器。例如,我將循環直到引發異常,然後在catch子句中使用break;。這是不好的做法嗎?查詢我循環的某些屬性以預先確定索引(即,預先確定什麼時候停止循環)會更高效(或更清潔)嗎?當然,只有當我確信實際上會拋出異常以避免無限循環時,我纔會這樣做。謝謝!使用處理的異常作爲預期的觸發器?

回答

0

是的,這是不好的做法。例外情況應該用於例外情況 - 例如在正常的操作過程中不應發生真實錯誤的情況。

一個重要的原因是異常在CPU時間方面很昂貴。

它會更有效率,並且如果您使用標誌或其他信號來終止您的循環,調試和驗證可能會更容易。

0

拋出異常作爲正常程序控制流程的一部分是不好的做法。例外情況應該保留爲特殊的事件,如錯誤處理。

它也不是很好循環等待事件發生。檢查出Observer design pattern正確方式來編碼這種類型的東西。

+0

這個downvoter會關心評論嗎? – Asaph 2009-11-11 09:47:27

2

這不是一個真正的語言不可知論問題!

某些語言(如Python)具有合理的輕量級異常,並且它們使控制流的異常成爲一種非常令人反感的方法 - 例如,Python中的每個for語句(除非過早由break終止)在發生異常時總是終止(for中使用的迭代器的異常StopIteration)。任何Python的用戶都不能因此反對系統性地由異常終止的循環......除非他們永遠不會使用for循環(相當不可能;-)。

其他語言認爲例外是非常特殊的事件,並且在那些語言中您不應該將它們用於普通流量控制任務;顯然目前給你的問題的所有答案都認爲這是以「語言不可知」的方式理所當然的,忽略了存在或實際的性質或語言,如Python。

我們這些熟悉這兩種語言的人都很合理地學會「用流暢遊泳」:在Python中使用流控制的異常沒有問題,但我肯定會避免在C++中這樣做,因爲例!