2012-01-30 76 views
1

例如:我們有基於MVC的Web應用程序。此外,我們使用這個應用程序:Spring,Struts 2Hibernate框架。Java:MVC項目中的錯誤處理。如何正確實施?

讓我們看看小場景:用戶嘗試保存一些instanse,例如:BO Book。

因此,用戶填寫表單域和發送請求到服務器:

發生了什麼事在服務器上?

  • 執行動作方法Action.Save();
  • 內部Action.Save()呼叫Service.save();
  • Inside Service.save()致電DaoHibernate.save();
  • Inside DaoHibernate.save()致電getHibernateTemplate().save();

方法getHibernateTemplate.save() - 它是框架實現,所以我們不能訪問這個方法。我們只知道,如果在此方法內部出現故障,則會引發DataAccessException

那麼,在這一刻我想,如何正確實現我的日誌記錄和錯誤處理?

在哪個級別?

On Dao level?服務水平?

還是關於Struts的行爲?

您對此有何看法?

還是需要每個級別?

您可以推薦哪些最佳實踐?

回答

3

這裏是你的架構:

enter image description here

你怎麼想手柄 DAO層上的錯誤?返回假數據?空集合?如果你不能,就讓異常彈出。

如何處理服務層?您知道數據庫不能正常工作,那麼您可以返回到Struts操作?一個空的結果?一個錯誤對象?是不是例外的錯誤對象?

所以異常出現在Struts動作中。在這裏你有一些選擇。如果異常實際上告訴用戶某些事情並且您的GUI已準備好,則可以返回不同的視圖(並在此處記錄異常)。

但是如果在Struts動作中發現NullPointerException?你會在每個Struts操作中分別處理它嗎?不,所以更進一步傳遞異常(!)

我覺得你的想法 - 只要你不知道如何處理(和記錄不處理)外,讓客戶端清理殘局。否則,您只有隱藏問題並增加損失(例如,交易不回滾,用戶看到不正確的結果)。

我會建議實施generic異常處理機制,它記錄異常並向用戶返回HTTP 500。溫和的錯誤信息(沒有堆棧跟蹤)應該出現,用戶應該道歉。您應該調查到達此層的每個錯誤。據我所知,Struts(以及幾乎每個Web框架)都有一些集中處理異常的方法。 (Struts 2 Exception Handling Docs

+0

很棒的圖!謝謝! – user471011 2012-01-30 15:52:00