【问题标题】:Crash when using error.localizedDescription from completion从完成中使用 error.localizedDescription 时崩溃
【发布时间】:2020-03-23 11:54:57
【问题描述】:

我正在尝试检查error.localizedDescription 是否包含某个string,但我一直在崩溃

if error.localizedDescription.contains("\"api.error.cardRejected.2000\"") {
   failCompletion()
 }

我什至尝试过使用另一种方式

if let description = (error! as NSError).userInfo[NSLocalizedDescriptionKey] as? String {
                if description.contains("api.error.cardRejected.2000") {
                     failCompletion()
                }
            }

我仍然在日志中遇到同样的崩溃说

-[__NSDictionaryM domain]: unrecognized selector sent to instance 0x60000046b520

当我使用debugDescription 检查时它可以工作,但我想使用localizedDecription 进行检查,因为调试仅在调试时工作

【问题讨论】:

  • 如果您检查代码是否唯一会更好。
  • @prasad 你是什么意思?
  • 你能告诉我们你试图从哪里得到错误的上下文吗?
  • 谁负责产生这个错误?看起来在某种程度上,底层错误被设置为字典而不是 nserror。
  • @sk123 我的意思是错误代码

标签: ios swift nserror


【解决方案1】:

NSError 本地化描述是从内部自动生成的,这是 API 所告诉的:

/* The primary user-presentable message for the error, for instance for NSFileReadNoPermissionError: "The file "File Name" couldn't be opened because you don't have permission to view it.". This message should ideally indicate what failed and why it failed. This value either comes from NSLocalizedDescriptionKey, or NSLocalizedFailureErrorKey+NSLocalizedFailureReasonErrorKey, or NSLocalizedFailureErrorKey. The steps this takes to construct the description include:
 1. Look for NSLocalizedDescriptionKey in userInfo, use value as-is if present.
 2. Look for NSLocalizedFailureErrorKey in userInfo. If present, use, combining with value for NSLocalizedFailureReasonErrorKey if available.
 3. Fetch NSLocalizedDescriptionKey from userInfoValueProvider, use value as-is if present.
 4. Fetch NSLocalizedFailureErrorKey from userInfoValueProvider. If present, use, combining with value for NSLocalizedFailureReasonErrorKey if available.
 5. Look for NSLocalizedFailureReasonErrorKey in userInfo or from userInfoValueProvider; combine with generic "Operation failed" message.
 6. Last resort localized but barely-presentable string manufactured from domain and code. The result is never nil.
*/
open var localizedDescription: String { get }

所以,它崩溃了(可能在第 6 步。)然后这个 NSError 被错误地构造了 - 所以找出谁和如何构造它,可能在底层错误的某个层,userInfo 的某些键意外设置为 NSDictionary 而不是NSError.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2021-10-30
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多