Ios 使用Objective-C捕获域中写入错误的正确方法是什么?

Ios 使用Objective-C捕获域中写入错误的正确方法是什么?,ios,objective-c,database,macos,realm,Ios,Objective C,Database,Macos,Realm,我们正在初始化时将相当多的项导入到领域数据库客户端。我们正在试图弄清楚为什么它会在一些客户端机器上崩溃,但我们不确定如何“捕获”这个错误来记录它。我已经读到,写错误是不打算被捕获的。下面是一些简化的代码 RLMRealm *realm = [RLMRealm defaultRealm]; [realm beginWriteTransaction]; for(NSDictionary* package in packages) { CMPackage *realm_package = [

我们正在初始化时将相当多的项导入到领域数据库客户端。我们正在试图弄清楚为什么它会在一些客户端机器上崩溃,但我们不确定如何“捕获”这个错误来记录它。我已经读到,写错误是不打算被捕获的。下面是一些简化的代码

RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
for(NSDictionary* package in packages)
{
     CMPackage *realm_package = [my_type createOrUpdateInDefaultRealmWithValue:package];
}

[realm commitWriteTransaction];
调用createOrUpdateInDefaultRealmWithValue时会发生崩溃,但仅在某些客户端上。我们认为它可能只是一个旧文件在更新之间徘徊,但我们无法找到它,因为我们无法捕获它。在中心语句周围放置try/catch是否安全?当其中一次写入发生错误时,提交写入事务是否安全?这个问题有好的解决方案吗

编辑:


我还应该注意到,我们希望在一个事务中完成所有操作,并且能够在一次写入失败后继续执行该事务,因为如果在单独的转换中完成写入操作,则速度会受到负面影响。

根据与Realm工程师的上述对话,似乎不支持在事务上测试和验证单个插入,并且只能在每个事务的基础上捕获错误。我想,因为这是一笔交易,如果出现异常,这将回滚所有其他插入。

您会遇到什么错误,以及
createOrUpdateInDefaultRealmWithValue
method做什么?@Dmitry-该方法是一个领域方法:realm.io/docs/objc/latest/api/Classes/RLMObject.html确切的异常未知,因为我们无法重新创建它,在引入名为
package
NSDictionary
变量时,在for循环中创建名为
package
的变量可能不是一个好主意。您可以使用
commitWriteTransaction:(NSError*)error
捕获写入错误,但是如果
createOrUpdateInDefaultRealmWithValue
引发异常,则需要找到捕获异常消息的方法。在尝试将其添加到领域之前,可能值得对
进行一些检查,以验证其信息是否有效。@TiM-Nice catch使用相同的变量名(上面已更正)。这只是把它翻译成帖子的一个错误。我已经看到了事务错误处理,但这将中止我假设的整个错误循环。我们代码中的实际循环比发布的要复杂一些,因此验证要复杂一些。它通过内省循环许多不同的领域对象类型,这会让检查对象变得很痛苦。我不是说这是不可能的,但是如果有一种方法可以在不中止事务的情况下优雅地捕获一个写入异常,那将非常有帮助。@David不,没有可以使用的“验证”机制。Realm只会对库的不正确使用抛出异常,您不应该捕获它们,因为这样做对于ARC Objective-C代码通常是不安全的。这就是为什么存在
commitWriteTransaction:(NSError*)错误。