目标 c 中的异常传播

Posted

技术标签:

【中文标题】目标 c 中的异常传播【英文标题】:Exception propagation in objective c 【发布时间】:2014-05-12 08:45:31 【问题描述】:

我是 Objective-c 的新手并创建了一个自定义异常。我想在 implementationC 的 functin1() 中处理一个异常(在 function3() 中抛出)。这是我的代码:

@implementatin A
 function3()
  
    if(contion)
    throw [[ApiException alloc] initwithName:@"", reasong:@"" userInfo:nil];
  


@implementatin B
  function2()
   
   function3();
    

 @implementatin C
 function1()
     
      function2();
      

【问题讨论】:

你的问题是什么 @try / @catch / @finally 想要在实现 C 的 functin1() 中处理异常(在 function3() 中抛出)。 异常在 Obj-C 中并不常见。你可能不应该使用它们。 你的代码离编译太远了。你应该先阅读关于objective-c的教程...... 【参考方案1】:

您可以通过捕获并重新抛出异常来传播异常:

@try 
    [self doSomethingElse:anArray];

@catch (NSException *theException) 
    @throw;

但是您需要知道,Objective-C 异常与 C++ 异常不同,如果不小心使用可能会导致泄漏。使用它们可能是个坏主意。确保您正确阅读 Apple 的 Exception Programming Guide。

【讨论】:

【参考方案2】:

显然你对 Objective-C 很陌生:没有函数,只有方法。所以我的第一个建议是买一本书或教程。

除此之外:您知道在Objective-C 中异常不是 处理错误的首选吗? https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Exceptions/Exceptions.html

其中一个原因是,ARC 不适用于开箱即用的异常。 (您必须打开异常处理,这会导致运行时损失。)

问您:通常您使用NSException 创建异常并使用@throw 抛出它们。你有通常的 try-catch-finally 重新抛出模式来处理它们: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html#//apple_ref/doc/uid/20000059-BBCHGJIJ

@try

   // something that can throw an exception

@catch (…)

   // catch it here
   @throw; // rethrow the catched exception.

【讨论】:

以上是关于目标 c 中的异常传播的主要内容,如果未能解决你的问题,请参考以下文章

Java 异常和目标 C NSError

从表视图中删除行时出现异常。 iOS 目标-C

外部链接的 C 库中的异常传播

如何在目标c中删除表格视图中的多个部分?

目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

神经网络中的反向传播法