Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 处理目标C客户机代码中错误的实施规程_Objective C_Exception Handling_Error Handling_Nsassert - Fatal编程技术网

Objective c 处理目标C客户机代码中错误的实施规程

Objective c 处理目标C客户机代码中错误的实施规程,objective-c,exception-handling,error-handling,nsassert,Objective C,Exception Handling,Error Handling,Nsassert,我见过Objective C代码使用一系列实践,从传递执行完成状态的NSError指针到使用‎NSAssert-to实现@throw-to为回调中返回的状态代码在委托上进行中继-to旧的c方法,该方法返回一个boolean/int,指示1为success和co 我无法确定应该如何处理在客户端设备上运行的应用程序中发生的错误的一致模式。对于ex,您建议如何处理以下情况: 客户端尝试访问网络资源,网络资源超时/返回500 逻辑代码段中是否达到了本不应发生的意外状态 尝试写入磁盘失败?(磁盘空间不足

我见过Objective C代码使用一系列实践,从传递执行完成状态的NSError指针到使用‎NSAssert-to实现@throw-to为回调中返回的状态代码在委托上进行中继-to旧的c方法,该方法返回一个boolean/int,指示1为success和co

我无法确定应该如何处理在客户端设备上运行的应用程序中发生的错误的一致模式。对于ex,您建议如何处理以下情况:

  • 客户端尝试访问网络资源,网络资源超时/返回500
  • 逻辑代码段中是否达到了本不应发生的意外状态
  • 尝试写入磁盘失败?(磁盘空间不足,不是权限和代码)

来自Java的服务器端实践异常是首选的武器,使用Objective C和C似乎存在异常,但不受鼓励。NSAssert看起来很苛刻,因为它会使应用程序崩溃,在大多数情况下,这不是最佳解决方案。因此,我非常感谢您的最佳实践建议

异常仅用于指示程序员错误和/或不可恢复的错误。异常不应用于流控制。NSAssert更像是一种开发工具。对可恢复的、用户可寻址(或导致的)错误使用NSError


首先,我们必须就术语达成一致。我认为程序中有两种类型的糟糕情况:错误和异常


错误可能发生的意外情况,但您可以在程序内存处于一致状态的情况下从中恢复,并可以继续执行

eg1。客户端尝试访问网络资源,网络资源超时/返回500? eg2。尝试写入磁盘失败?(磁盘空间不足,不是权限和代码)

方法按照您希望的方式处理错误。显示用户消息,将其记录到文件/控制台,如果您认为需要报告,则将其报告到后端


异常本不应达到的状态,可能会损坏应用程序的内存状态,从而阻止进一步执行

这可能发生在两个层面

级别1您忽略的逻辑错误,现在导致异常

eg1。访问无效数组元素,即索引越界异常

在上面的示例中,您无意中犯了一个编程错误。你不可能处理它,因为你忽略了它。这将使应用程序崩溃

方法您在这里的方法应该是识别错误并修复它。在这个过程中,一些最终用户将受到影响,这是最细致的软件的情况

第2级

在编程时,您会遇到业务逻辑不允许的情况

eg1。逻辑代码段中是否达到了本不应发生的意外状态

eg2。您始终希望按照业务逻辑显示的数据库条目。例如,假设您正在制作一个应用程序,该应用程序需要一个包含货币名称、货币和国家名称的unicode符号的货币表。此表中的值将在UI中显示为下拉列表。您可以在第一次启动应用程序时创建一个表并插入值,也可以在捆绑包中提供该表,但您始终希望它包含您插入的值。进行sqlite选择查询->sqlite执行成功->但不返回任何值。业务逻辑要求值应该存在,但由于某种神秘的原因,它们不存在

这里是最令人困惑的地方,因为有时您可以通过将这些情况视为错误并向最终用户显示消息来从这些情况中恢复过来。这种方法是错误的。这是业务逻辑级别的异常。一个你应该避免发生的事情

方法您应该在这里强制崩溃应用程序,并在开发和生产模式下使用NSAsserts。这是一种激进的方法,一些最终用户会受到影响,但我读过一些专家建议采取激进的方法来发现并纠正错误,而不是假装它们不存在,或者认为你已经聪明地涵盖了所有这些错误,而你所做的只是通过“处理策略”将异常掩盖为错误。我相信专家们是对的。来自Java,您可能会发现这是一个非常困难的问题。。做事的方式


Nils和Bools你应该明白,它们只是帮助你得出结论,判断你是将某件事视为错误还是例外。它们本身并不是目的。在使用返回值编写方法时,应该定义nil或bool(no)表示什么,并在方法顶部记录您的意图。有时是错误,有时是例外,有时是正常的预期结果。在处理apple框架/第三方库时,您应该了解它们在返回此类值时的意图,并确定您希望在代码中如何处理它们


一些其他提示

  • 不要使用@try/catch,因为专家这么说。如果你想挑战他们,假设苹果把它放在那里是有原因的,苹果永远是对的,专家(包括苹果员工自己)在这么多年后都弄错了,你可以继续做下去

  • 形式化你的方法->坚持它->记录你的意图。不要三思而后行。因为在某个阶段,错误/例外/零/布尔会越过礼节的界限,到达品味的范围。你最好一劳永逸地解决这个问题