objective-c - 在 Objective-C 中记录错误的更简洁的方法

标签 objective-c cocoa-touch cocoa nserror

许多 Cocoa 方法采用可选的 NSError ** 参数,用于报告错误。我发现自己经常使用这样的方法,即使在可能发生错误的唯一方式是我的编程错误而不是意外的运行时条件的情况下也是如此。因此,我不想编写任何将执行任何用户可见操作的错误处理代码。对于错误,我真正想做的就是记录错误(可能还有崩溃),同时让我的代码尽可能简洁和可读。

问题在于“保持代码简洁”和“记录错误”目标相互矛盾。我经常在这两种方法之间做出选择,我都不喜欢这两种方法:

<强>1。为错误指针参数传递 NULL。

[managedObjectContext save:NULL];
  • 优点:简洁、可读,并明确指出不会出现错误。完全没问题,只要我相信这里的错误在逻辑上是不可能的是正确的。
  • 缺点:如果我搞砸了并且发生错误确实,它不会被记录下来并且我的调试会更加困难。在某些情况下,我可能甚至没有注意到发生了错误。

<强>2。传递一个 NSError ** 并记录产生的错误,每次都使用相同的样板代码。

NSError *error;
[managedObjectContext save:&error];
if (error) {
    NSLog(@"Error while saving: %@", error);
}
  • 优点:错误不会悄无声息地传递 - 我会收到错误提示并获得调试信息。
  • 缺点:非常冗长。它写起来更慢,读起来也更慢,而且当它已经嵌套在某些级别的缩进中时,我觉得它会降低代码的可读性。经常这样做只是为了记录错误,并且习惯于在阅读时跳过样板文件,这也让我有时无法注意到我正在阅读的某些代码实际上有明显的错误处理 block 来处理预期在运行时发生的错误。

我有使用 Python、Java、PHP 和 Javascript 等语言的背景,我发现必须额外编写 4 行样板文件才能收到我使用的语言中出现的错误类型的通知,这有点麻烦到,我会通过异常或警告找出错误,而无需编写任何明确检查错误的代码。

我最喜欢的是一些巧妙的技巧,我可以使用它来自动记录这些方法产生的错误,而无需在每次方法调用时都编写样板文件,从而让我受益于惰性 NULL 传递方法和错误记录样板。换句话说,我想这样写:

[managedObjectContext save:&magicAutologgingError];

并且知道如果该方法创建了一个 NSError,它会以某种方式神奇地被记录下来。

我不太确定该怎么做。我考虑过使用一个 NSError 子类,它在 dealloc 上记录自己,但意识到由于我不负责实例化 Cocoa 方法创建的错误对象,所以我的子类不会无论如何被使用。我考虑过使用 method swizzling 让 all NSError 像这样在 dealloc 上记录自己,但我不确定这是否真的是可取的.我考虑过使用某种观察者类来监视内存中给定的常量空间,我可以将其用于要记录的 NSError 指针,但据我所知,没有办法做任何事情就像用于观察内存中任意空间的 KVO 一样,所以除了有一个线程反复检查错误以记录日志之外,我看不到实现它的方法。

谁能找到实现这一目标的方法?

最佳答案

只需创建一个包装器函数(或类别方法)来执行您想要的操作:

bool MONSaveManagedObjectContext(NSManagedObjectContext * pContext) {
 NSError * error = nil;
 bool result = [pContext save:&error];
 if (!result && nil != error) {
  // handle  the error how you like -- may be different in debug/release
  NSLog(@"Error while saving: %@", error);
 }
 return result;
}

并改为调用它。或者您可能更愿意将错误处理分开:

void MONCheckError(NSError * pError, NSString * pMessage) {
 if (nil != pError) {
  // handle  the error how you like -- may be different in debug/release
  NSLog(@"%@: %@", pMessage, pError);
 }
}

...

NSError * outError = nil;
bool result = [managedObjectContext save:&outError];
MONCheckError(outError, @"Error while saving");

始终注意重复代码:)


I considered using method swizzling to make all NSErrors log themselves on dealloc like this, but I'm not sure if that would actually be desirable.

这是不可取的。

关于objective-c - 在 Objective-C 中记录错误的更简洁的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066688/

相关文章:

objective-c - 是否需要应用程序委托(delegate)类? (设计建议)

cocoa - 如何在 Cocoa 中以编程方式创建 bundle ?

iphone - MPMediaItem 如何播放?

objective-c - 计算时间并获取状态

iphone - 动态表格 View 中的静态表格单元格?

cocoa-touch - 使旋转的(垂直的) slider 看起来很漂亮

iphone - 当应用程序已经运行时将本地通知声音静音

cocoa - 是否行程矩形 : of NSBezierPath always draw a transparent rect? (Cocoa OSX)

objective-c - 如何获取目录中的dylib版本信息

ios - UITextView 忽略 Retina 中的 AttributedText