11

我在我的Android應用程序中有一個自定義內容提供程序,運行良好。我希望其他應用程序也可以訪問我的內容提供商。我希望有一些乾淨的方式來溝通異常和錯誤,但據我所知,Android內容提供者框架並沒有提供任何方式來跨進程傳播異常。在Android自定義內容提供商中處理(跨進程)異常

我應該如何向呼叫者指出異常狀態?我必須以某種方式將其編碼到我的返回數據中,並依靠客戶端進行檢查嗎?有其他選擇嗎?如果編碼到普通的返回數據中,最好的辦法是什麼? (我可以看到一些用於通過query調用返回的Cursor的替代品,但對於由insert返回Uri,或updatedelete返回int?)

+0

當您嘗試在ContentProvider中引發某種'RuntimeException'時,發生了什麼? – CommonsWare 2012-08-15 21:13:32

+0

當提供者拋出一個'RuntimeException'時,使用'ContentProviderClient','query'和'insert'都返回'null'。在logcat中,我可以看到一個標籤爲'JavaBinder'的消息:'***未被捕獲的遠程異常! (過程中還不支持異常。)' – 2012-08-17 15:50:07

回答

14

還有就是RuntimeException子類,其短名單,如果拋出提供者,將被重新拋出在客戶端應用程序中。它們是:

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

來源:Creating Content Providers提到IAENPE;我猜想其他人會根據the Javadoc forParcel.writeException工作。

客戶端應用程序只會獲取詳細消息,而不是堆棧跟蹤或原因堆棧。對於可編碼爲String(詳細消息)的異常狀態,這是一個合理的選擇。

我還對其他解決方案感興趣。

+0

我最終使用Android的[org.json包](http://developer.android.com/reference/org/json/package-summary.html)將數據編碼到「IllegalStateException」的詳細消息,併爲客戶端提供API以將反射轉換爲其他「Exception」類。 – 2012-08-22 14:10:45