2010-03-22 60 views
2

我正在用我的編程類之一的C++編寫wxwidgets的GUI應用程序。如果它不符合某些條件,我們必須驗證輸入並拋出自定義異常。我的問題是,當談到這個問題時,最佳做法是什麼?我應該編寫一個單獨的函數來檢查錯誤,並讓我的事件處理程序的調用起作用嗎?還是應該在我的事件處理程序中進行錯誤檢查?還是它真的很重要?最佳實踐 - 在簡單的GUI應用程序中驗證輸入?

謝謝!

回答

2

爲此拋出異常似乎有點奇怪。

我一直認爲,一個GUI應用程序應該防止即使在控制,可使用事件處理程序的操作被輸入無效數據。對於表單上多個控件之間不一致的數據,在按下「確定」按鈕或其他方式時應該進行驗證,如果數據不正常,請阻止表單關閉並指出錯誤。

驗證也可以在按下OK之前完成,但它不應該阻止輸入的數據,只會指出問題(也許可以禁用OK按鈕直到其固定)。基本上,一旦用戶編輯了他正在移動的下一個控件中的值,在此控件中輸入的不一致值可能不一致。

儘量避免消息框報告這些錯誤 - 內部形式是一個較好的狀態欄或只讀文本控件。

甲功能/方法應該被定義完成所有表單的一致性檢查,但它不應該拋出異常。糟糕的輸入不是典型用戶的「例外」情況 - 它始終發生,尤其是當我是用戶時。更重要的是,只有在錯誤處理會破壞代碼的結構時,才應該使用異常,而「這種形式的數據是否正常 - 是的,很好,接受和關閉」不應該是這種情況。事件處理器。

的功能應該只返回一個錯誤代碼,表示要報告的錯誤 - 或者報告錯誤本身並返回一個錯誤標誌。

不久前,wxWidgets甚至沒有異常安全 - IIRC,當您構建庫時,仍然必須啓用異常安全性作爲選項。

0

你提出比這更大的擔憂,其實。爲了回答你的問題,如果你有多個需要相同驗證的小部件,你可以將驗證代碼分解爲不同的函數。或者只是因爲你認爲它適合 - 這取決於你。

但是錯誤處理應該在哪裏的決定是一個更體系結構的問題。考慮design by contract,這意味着任何方法假定其參數或輸入處於有效狀態,並保證其輸出或返回值也是有效的。這意味着你應該儘快驗證用戶的輸入,而不是讓內部邏輯處理。