在objective-c中复制Java Try-Catch哲学

Leo*_*rdo 0 objective-c try-catch

我来自Java背景,其中try/catch是常见的做法.

使用objective-c几个月后,我从未在我的iOS应用程序中实现try/catch,因为语言本身的性质以及不使用它的一般建议.

因此,我一直试图构建无错误的代码.但是,在撰写本文时,我仍然不知道如何在Objective-c中翻译这样简单的事情:

// some operation
try {
  // do some work
} catch (SomethingWentWrongException e) {
  // log error, inform user...etc
}
// some more operation and rest of the code
Run Code Online (Sandbox Code Playgroud)

使用此代码执行try/catch操作,但程序没有中断,并且执行catch之后的其余代码.

但是有一条规则告诉我们不应该使用try catch进行流量控制.我想用objective-c实现类似的东西,在不破坏工作流的情况下封装一些可能成功或不成功的不太重要的操作.

如果没有objective-c @try,我怎么能这样做呢?

谢谢

小智 6

可以使用@try@catch(和@finally)使用Objective-C来做到这一点.有没有"规则",说你不这样做,但有一个普遍的设计成语在Cocoa和代码生成与可可整合:异常被保留用于编程错误.这意味着如果使用您的API的人不遵守合同,或者不满足调用您的方法的一些先决条件,那么这是许多Objective-C开发人员使用异常的唯一时间.

在Objective-C代码中处理错误的常用习惯(例如我的文件消失,我无法获得我需要的资源等)是使用Cocoa的NSError类,通过引用传递实例可能会失败的方法.所以,重写你的例子:

// some operation
NSError *error;
BOOL itWorked = [object doSomeThingThatCouldFail: &error];
if (!itWorked) {
    // log error, inform user etc.
}
// some more operation and rest of the code
Run Code Online (Sandbox Code Playgroud)

请注意,检查方法的返回值以检查方法是成功还是失败.该error目标是保证在故障设置,但没有承诺作出关于它的成功.

该方法的实现方式与错误一起使用:

- (BOOL)doSomeThingThatCouldFail: (NSError *__autoreleasing*)error {
  //...
  if (!success && error) //check that the user actually supplied an error pointer
  {
    NSDictionary *errorDetails = @{ ... };
    *error = [NSError errorWithDomain: @"Your error domain" code: someInteger userInfo: errorDetails];
  }
  return success;
}
Run Code Online (Sandbox Code Playgroud)