问题 处理Android自定义内容提供程序中的(跨进程)异常


我的Android应用中有一个自定义内容提供商,运行得相当好。我希望其他应用也可以访问我的内容提供商。我想要一些干净的方式来传达异常和错误,但据我所知,Android内容提供程序框架没有提供任何方法来跨进程传播异常。

我应该如何向调用者指明异常状态?我是否必须以某种方式将其编码为我的返回数据并依赖客户端进行检查?还有其他选择吗?如果将编码转换为普通的返回数据,那么最好的方法是什么? (我可以看到一些替代品 Cursor 由...返回 query 打电话,但是怎么样 Uri 归来的 insert, 或者 int 归来的 update 要么 delete?)


9126
2017-08-15 20:16


起源

当你尝试提高某种程度 RuntimeException 从你的 ContentProvider, 发生了什么? - CommonsWare
运用 ContentProviderClient, query 和 insert 都归来了 null 当提供者抛出一个 RuntimeException。在logcat中,我可以看到带有标记的消息 JavaBinder: *** Uncaught remote exception! (Exceptions are not yet supported across processes.) - Robert Tupelo-Schneck


答案:


有一个简短的清单 RuntimeException 子类,如果在提供程序中抛出,将在客户端应用程序中重新抛出。这些包括:

  • IllegalStateException
  • IllegalArgumentException
  • NullPointerException
  • SecurityException
  • BadParcelableException

最新的更新 Parcel.writeException 文件补充

  • UnsupportedOperationException
  • NetworkOnMainThreadException

资源: 创建内容提供商 提到 IAE 和 NPE;我猜想其他人会在此基础上工作 Javadoc for Parcel.writeException

客户端应用程序只会获取详细消息,而不是堆栈跟踪或原因堆栈。对于可以编码为a的异常状态 String (详细信息),这是一个合理的选择。

我也对其他解决方案感兴趣。


14
2017-08-17 19:40



我最终使用的是Android org.json包 将数据编码到一个详细消息中 IllegalStateException,并为客户提供API,使用反射转换为其他 Exception 类。 - Robert Tupelo-Schneck