Pas*_*que 3 nserror ios parse-platform swift
在Swift 1.2应用中,我有一些记录NSError对象的代码。在极少数情况下,我从Crashlytics收到崩溃报告,表明访问该localizedDescription属性导致崩溃。
这是我的错误记录功能:
func trackError(error: NSError)
{
var props = [String: AnyObject]()
// CRASHES HERE
props["NSErrorLocalized"] = error.localizedDescription
props["NSErrorCode"] = error.code
props["NSErrorDomain"] = error.domain
if let userInfo = error.userInfo {
props["NSErrorUserInfo"] = userInfo
}
self.trackEvent("Error", withProperties: props)
}
Run Code Online (Sandbox Code Playgroud)
这是Crashlytics报告的调用堆栈:
0 CoreFoundation CFHash + 129
1 CoreFoundation CFBasicHashFindBucket + 1204
2 CoreFoundation CFBasicHashFindBucket + 1204
3 CoreFoundation CFDictionaryGetValue + 106
4 CoreFoundation _CFErrorCreateLocalizedDescription + 266
5 Foundation -[NSError localizedDescription] + 82
Run Code Online (Sandbox Code Playgroud)
我在考虑直接访问NSLocalizedDescriptionKeyin error.userInfo而不是通过localizedDescription属性访问,但是由于调用栈暗示它在访问字典时崩溃(这很可能是userInfo字典),所以我担心它无法解决任何问题。
我不介意localizedDescription在错误日志中不包含,但是我需要一种安全的方法来检查是否存在一个而不崩溃。
可能值得注意的事情:NSError引起崩溃的对象似乎是Parse SDK返回的对象。我无法确定这一点,但是我的其余日志中似乎有一些线索暗示了这一点。
我尝试通过对Parse SDK进行各种调用来强制错误情况来重现此错误,但是我的错误日志记录代码可以毫无问题地处理它们,并且该localizedDescription属性返回有效字符串而不会崩溃。
其他人已经看到了这一点,并且对正在发生的事情有任何线索吗?
可能崩溃的一种可能方式是,如果在(Objective-C)中创建了类似[NSError new]或的错误[[NSError alloc] init](即未调用指定的初始化程序)。至少在iOS9中,该操作返回一个有效的实例,但是其内部结构未正确初始化,如果您在其上调用方法,则可能会崩溃。调用-userInfo只会返回一个空字典,但是尝试访问其他内部状态(如-localizedDescription和类似方法)会导致崩溃。
我最终通过以下方式解决了这个问题:
if let localizedDescription = error.userInfo[NSLocalizedDescriptionKey] as? String {}
Run Code Online (Sandbox Code Playgroud)
而不是直接访问该属性。
| 归档时间: |
|
| 查看次数: |
963 次 |
| 最近记录: |