偶爾在我的代碼中,我會故意使用拋出的異常作爲事件觸發器。例如,我將循環直到引發異常,然後在catch
子句中使用break;
。這是不好的做法嗎?查詢我循環的某些屬性以預先確定索引(即,預先確定什麼時候停止循環)會更高效(或更清潔)嗎?當然,只有當我確信實際上會拋出異常以避免無限循環時,我纔會這樣做。謝謝!使用處理的異常作爲預期的觸發器?
2
A
回答
0
是的,這是不好的做法。例外情況應該用於例外情況 - 例如在正常的操作過程中不應發生真實錯誤的情況。
一個重要的原因是異常在CPU時間方面很昂貴。
它會更有效率,並且如果您使用標誌或其他信號來終止您的循環,調試和驗證可能會更容易。
0
拋出異常作爲正常程序控制流程的一部分是不好的做法。例外情況應該保留爲特殊的事件,如錯誤處理。
它也不是很好循環等待事件發生。檢查出Observer design pattern爲正確方式來編碼這種類型的東西。
2
這不是一個真正的語言不可知論問題!
某些語言(如Python)具有合理的輕量級異常,並且它們使控制流的異常成爲一種非常令人反感的方法 - 例如,Python中的每個for
語句(除非過早由break
終止)在發生異常時總是終止(for
中使用的迭代器的異常StopIteration
)。任何Python的用戶都不能因此反對系統性地由異常終止的循環......除非他們永遠不會使用for
循環(相當不可能;-)。
其他語言認爲例外是非常特殊的事件,並且在那些語言中您不應該將它們用於普通流量控制任務;顯然目前給你的問題的所有答案都認爲這是以「語言不可知」的方式理所當然的,忽略了存在或實際的性質或語言,如Python。
我們這些熟悉這兩種語言的人都很合理地學會「用流暢遊泳」:在Python中使用流控制的異常沒有問題,但我肯定會避免在C++中這樣做,因爲例!
相關問題
- 1. 處理預期異常
- 2. 如何處理預期的SQL異常?
- 3. JavaScript事件處理程序觸發「錯誤:CS1026:)預計」異常
- 4. Postgres觸發器中的遠程異常處理?
- 5. CruiseControl.NET預處理器'include'異常
- 6. 未處理的異常:預期字符串字面調用JSON.parse
- 7. 處理不可預見的異常
- 8. 異常處理使用瀏覽器而不是異常助理
- 9. 如何使用boost.wave作爲使用cmake的預處理器
- 10. 使用NUnit測試預期的異常
- 11. 異步處理使用列表的斯卡拉期貨與onComplete異常處理
- 12. 處理預期的單元測試異常C#
- 13. 如何編寫測試來處理預期的異常?
- 14. 異常視爲用戶未處理的,即使它處理
- 15. Apex腳本中未處理的異常觸發的Salesforce
- 16. 使用aop處理異常
- 17. 使用HibernateDaoSupport處理異常
- 18. 使用Retrofit2處理異常
- 19. DbContext,處理併發異常
- 20. 在AJAX期間未處理的異常
- 21. Javascript是否觸發未處理/未捕獲異常的事件?
- 22. 處理異常IN動作過濾器
- 23. TSQL觸發行爲異常
- 24. 使用Python製作預處理器
- 25. 異常處理:多次處理異常
- 26. 在Flipview和觸摸手勢中使用Listview時發生未處理的異常
- 27. EJB處理器異常處理
- 28. Task.Factory.StartNew異常觸發的異常
- 29. SQL預處理語句異常
- 30. JUnit4預期異常
這個downvoter會關心評論嗎? – Asaph 2009-11-11 09:47:27