【问题标题】:How to pretty-print an NSError object in Xcode console?如何在 Xcode 控制台中漂亮地打印 NSError 对象?
【发布时间】:2011-11-02 13:27:40
【问题描述】:

我在 Xcode 控制台中打印了一个 NSError 对象(通过NSLog(@"%@", error);),对于某种错误,这就是我得到的:

Domain=NSCocoaErrorDomain Code=133020 "The operation couldn’t be completed. (Cocoa error 133020.)" UserInfo=0xe939170 {conflictList=(
    "NSMergeConflict (0xe93cad0) for NSManagedObject (0x5dba970) with objectID '0x5dc26f0 <x-coredata://775D53AE-58A4-4B18-BA52-D46781A183AE/SomeObject/p1>' with oldVersion = 2 and newVersion = 3 and old object snapshot = {\n    creationDate = \"2011-08-24 06:52:22 +0000\";\n    prop1 = \"a65e349a-b315-488e-b7f8-e459e353fd6e\";\n    username = \"test-user\";\n    password = \"foobar\";\n} and new cached row = {\n    creationDate = \"2011-08-24 06:52:22 +0000\";\n    prop1 = \"a65e349a-b315-488e-b7f8-e459e353fd6e\";\n    username = \"test-user\";\n    password = \"foobar\";\n}"

当我在 emacs 中将所有 '\n 替换为换行符并将所有 \"s 替换为 " 时,我会收到一条格式非常精美的错误消息:

Domain=NSCocoaErrorDomain Code=133020 "The operation couldn’t be completed. (Cocoa error 133020.)" UserInfo=0xe939170 {conflictList=(
    "NSMergeConflict (0xe93cad0) for NSManagedObject (0x5dba970) with objectID '0x5dc26f0 <x-coredata://775D53AE-58A4-4B18-BA52-D46781A183AE/SomeObject/p1>' with oldVersion = 2 and newVersion = 3 and old object snapshot = {
    creationDate = "2011-08-24 06:52:22 +0000";
    prop1 = "a65e349a-b315-488e-b7f8-e459e353fd6e";
    username = "test-user";
    password = "foobar";
} and new cached row = {
    creationDate = "2011-08-24 06:52:22 +0000";
    prop1 = "a65e349a-b315-488e-b7f8-e459e353fd6e";
    username = "test-user";
    password = "foobar";
}"

我更愿意在 Xcode 本身中看到这个格式良好的错误消息,而不是在另一个编辑器中复制粘贴它并搜索和替换字符。有没有办法做到这一点?

EDIT为清楚起见,错误是由核心数据保存操作产生的:

NSError *error
if (![context save:&error]) {
    NSLog(@"%@", error);
}

在这种情况下,错误对象的违规部分(从其中打印 \n 和 \"s)是错误的 userInfo 字典中的 conflictList 键的值。

【问题讨论】:

  • 你试过简单的NSLog(@"%@", [error userInfo]);po [error userInfo]吗?
  • 是的,我尝试打印错误的userInfo。得到了与上一个相同的输出,只是没有打印错误域和代码。
  • po [error userInfo] 是什么意思?
  • po [error userInfo]是调试器打印出userInfo字典的命令,类似于NSLog语句。
  • 我认为您不会找到一个好的通用解决方案。错误有不同的 userInfo 字典。

标签: ios xcode cocoa macos debugging


【解决方案1】:

userInfo 是一个 NSDictionary

 NSLog(@" error => %@ ", [errorOrNil userInfo] )

为我打印类似的东西

error => {
    NSLocalizedDescription = "User already exists";
    NSLocalizedFailureReason = "";
    NSLocalizedRecoverySuggestion = "Retry request based on information in `NSLocalizedFailureReasonErrorKey`";
    kinveyErrorCode = UserAlreadyExists;
    kinveyInternalErrorString = "";
    kinveyRequestId = e5be0aed155e4925b3365d57de3dc5b2;
} 

你也可以试试:

 NSLog(@" error => %@ ", [errorOrNil localizedDescription] )

打印出来的:

You got an error: User already exists 

【讨论】:

    【解决方案2】:

    这不是一个很酷的解决方案——您可以为 NSError 类编写自己的类别并根据需要表示文本。

    【讨论】:

    • 有趣的解决方案——但我正在寻找一个更通用的解决方案,因为我不知道我将来会遇到什么样的错误。例如在这种情况下,错误的userInfo 字典的@"conflictList" 键是罪魁祸首。情况并非总是如此。
    猜你喜欢
    • 2011-09-29
    • 2013-08-13
    • 2013-07-31
    • 1970-01-01
    • 2017-07-28
    • 2018-09-08
    • 2015-03-02
    • 2015-11-29
    • 2013-08-25
    相关资源
    最近更新 更多