在 Cocoa 应用程序中使用异常处理与 NSError

2024-03-01

大家好。我一直在阅读苹果关于何时/何地/如何使用 NSError 与 @try/@catch/@finally 的建议。本质上,我的印象是苹果认为最好避免使用异常处理语言结构,除非作为在意外错误情况下停止程序执行的机制(也许有人可以举一个这种情况的例子?)

我来自 Java,当人们想要处理错误时,异常是一种可行的方法。诚然,我仍然停留在 Java 思想空间中,但我正在慢慢掌握 NSError 提供的所有内容。

我困扰的一件事是发生错误时清理内存的任务。在许多情况下(例如,使用 C、C++ 库、CoreFoundation 等),在因错误而中断函数之前,需要执行大量内存清理工作。

这是我编造的一个例子,它准确地反映了我遇到的情况。使用一些虚构的数据结构,该函数打开一个文件句柄并创建一个“MyFileRefInfo”对象,其中包含有关如何处理该文件的信息。在关闭文件句柄并释放结构体的内存之前,已经对文件完成了一些操作。使用苹果的建议我有这个方法:

- (BOOL)doSomeThingsWithFile:(NSURL *)filePath error:(NSError **)error
{
  MyFileReference inFile; // Lets say this is a CF struct that opens a file reference
  MyFileRefInfo *fileInfo = new MyFileRefInfo(...some init parameters...);

  OSStatus err = OpenFileReference((CFURLRef)filePath ,&inFile);

  if(err != NoErr)
  {
    *error = [NSError errorWithDomain:@"myDomain" code:99 userInfo:nil];
    delete fileInfo;
    return NO;
  }

  err = DoSomeStuffWithTheFileAndInfo(inFile,fileInfo);

  if(err != NoErr)
  {
    *error = [NSError errorWithDomain:@"myDomain" code:100 userInfo:nil];
    CloseFileHandle(inFile); // if we don't do this bad things happen
    delete fileInfo;
    return NO;
  }      

  err = DoSomeOtherStuffWithTheFile(inFile,fileInfo);

  if(err != NoErr)
  {
    *error = [NSError errorWithDomain:@"myDomain" code:101 userInfo:nil];
    CloseFileHandle(inFile); // if we don't do this bad things happen
    delete fileInfo;
    return NO;
  }      

  CloseFileHandle(inFile);
  delete fileInfo;
  return YES;

}

现在..我的Java逻辑告诉我,最好将其设置为try/catch/finally结构,并将所有关闭文件句柄和释放内存的调用放在finally块中。

就像这样..

    ...

    @try
    {
      OSStatus err = OpenFileReference((CFURLRef)filePath ,&inFile);
      if(err != NoErr)
      {
        ... throw some exception complete with error code and description ...
      }

      err = DoSomeStuffWithTheFileAndInfo(inFile,fileInfo);

      if(err != NoErr)
      {
         ... throw some exception ...
      }

      ... etc ...        
}
@catch(MyException *ex)
{
        *error = [NSError errorWithDomain:@"myDomain" code:[ex errorCode] userInfo:nil];
        return NO;
}
@finally
{
        CloseFileHandle(inFile); // if we don't do this bad things happen
        delete fileInfo;
}
return YES;

我是否疯狂地认为这是一个更优雅的解决方案,冗余代码更少? 我错过了什么?


丹尼尔的答案是正确的,但这个问题值得一个更直白的答案。

仅当遇到不可恢复的错误时才抛出异常。

当传达可以恢复的错误情况时使用 NSError。

通过 Apple 框架中的框架引发的任何异常都可能导致未定义的行为。

有一个异常编程主题文档 https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Exceptions/Exceptions.html可在开发中心获取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Cocoa 应用程序中使用异常处理与 NSError 的相关文章

  • C++ new int[0]——它会分配内存吗?

    一个简单的测试应用程序 cout lt lt new int 0 lt lt endl outputs 0x876c0b8 所以看起来确实有效 标准对此有何规定 分配 空内存块总是合法的吗 从5 3 4 7 当直接新声明符中的表达式的值为零
  • 在不同的捆绑包上测试 iPhone 应用内购买?

    我们有一组 iPhone 应用程序的 Beta 测试人员 最近 我们在应用程序中添加了应用内购买功能 在此之前 我们会使用单独的捆绑 ID 和名称向 Beta 测试人员发送临时版本 以便他们可以在手机上拥有商店版本和临时版本 然而 似乎我们
  • Objective-C中如何使继承的类能够看到父类的隐藏方法[重复]

    这个问题在这里已经有答案了 我有两个类 Class1 和 Class2 第二个类继承自第一个类 我需要重写 Class1 的 update 方法来实现我的目标 继承方法中 update方法的改变是在代码中间进行的 所以我不能使用 超级更新
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • CBPeripheral 名称有时为 null

    我正在开发一个应用程序来与蓝牙 LE 外围设备进行通信 我目前正在测试的外围设备是其中之一these http www ti com tool cc2540dk mini 有趣的是 有时当我发现它时 我会得到它的正确名称 SimpleBLE
  • 如何在 UICollectionView 的节标题中动态添加标签和按钮?

    请帮助我如何水平添加标签和水平添加类似的按钮 但每个按钮应像另一个部分一样在每个标签的下方对齐 这应该在 UICollectionView 的标题中动态发生 因为标签和按钮的数量根据我的数据 我想制作一种 Excel 类型的布局 并在标题中
  • 多次添加同一个子视图来查看

    我不知道这是否可行 但我想做的是将子视图多次添加到视图中 我尝试过这样的事情 self view addSubview newView newView center CGPointMake 160 100 self view addSubv
  • 为什么使用[ClassName alloc]而不是[[self class] alloc]?

    我正在读马克 达尔林普尔 Mark Dalrymple 的著作在 Mac 上学习 Objective C 仅在协议章节 所以仍然相对较新 并试图弄清楚一些事情 为什么要通过类自己的名称来引用它 如果我有一个叫做Foo 为什么我会想写 比如说
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • 如何确定iPhone铃声的当前级别?

    我正在使用 AVSystemController 将 iPhone 铃声静音 但我不知道如何确定铃声的当前级别 有任何想法吗 PS 是的 我知道使用 AVSystemController 可能会导致应用程序被 App Store 禁止 这不
  • UISplitViewController - 推送模态视图

    使用 UISplitViewController 时推送模态视图的最佳实践是什么 您会从 RootViewController DetailViewController 还是直接从应用程序委托推送 理想情况下 我想要实现的功能是在基于某些条
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • Swift 中带圆角的 NSWindow

    我想要一个圆角的窗户 但我在每个角落都有一个白点 Code let effect NSVisualEffectView frame NSRect x 0 y 0 width 0 height 0 effect blendingMode be
  • 避免“在此块中强烈捕获自身可能会导致保留周期”消息

    每次我必须在块内使用全局变量或属性时 如下所示 self save if isItSaving NO self saveMyFile 我必须像这样重写 BOOL iis isItSaving id myself self self save
  • 如何通过辅助功能 API 获取当前所选文本的全局屏幕坐标。

    我需要帮助来了解字典应用程序如何在任何应用程序上按 CMD CTRL D 时显示所选文本的以下弹出对话框 我想实施 我的可可应用程序具有相同的功能 我的应用程序将在后台运行 并显示有关所选文本的一些热键的建议 我已经实现了热键捕获 我只需要
  • iPhone,如何隐藏标签栏按钮?

    如何隐藏单个标签栏按钮 我已经搜索过 但什么也没找到 只找到了完整的栏 我已经取得了一些进展 但仍然遇到问题 此代码位于我的应用程序委托中 带有选项卡栏的出口 我在其中调用它viewDidLoad选项卡栏中显示的第一个视图的视图 void
  • 如何从通讯录 ios 以编程方式编辑电话号码值

    我正在尝试在 iOS 中以编程方式替换特定联系人的特定电话号码 获取联系人表单地址簿 我不知道为什么我无法保存新的电话号码并刷新地址簿以显示更改 我正在这样做 BOOL changeContactPhoneNumber NSString p
  • 使用 Objective C 将 RGB 彩色图像更改为灰度图像

    我正在开发一个将彩色图像更改为灰度图像的应用程序 然而 有些图片显示出来是错误的 我不知道代码有什么问题 也许我输入的参数有误 请帮忙 UIImage c UIImage imageNamed downRed png CGImageRef
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • 如何按字母顺序对 NSMutable 数组中的自定义对象字段进行排序?

    我有一个自定义对象 例如 import

随机推荐

  • 尝试使鼠标光标在硒测试用例中可见

    我在 chromedriver 上使用 Java 中的 Selenium Webdriver 并尝试在执行测试用例时永久显示光标 我尝试过机器人和动作课 但没有成功 例如我尝试过这个 Actions builder new Actions
  • Docker 开发环境中的丰富编辑器

    所以我和我的团队已经购买了 Docker 它对于部署和测试来说非常棒 我真正的问题是如何建立良好的开发人员体验 特别是围绕编写 Python 应用程序 但这个问题可以推广到 Nodejs Java 等 问题 在编写 Python 应用程序时
  • IE 中奇怪的滚动行为,带有可滚动 div 中的复选框

    我有一个 多选 控件 如下所示 抱歉 ID 名称很长 它们是自动生成的 因为整个事情是由自定义标记生成的 div class default skin outer div class default control span class d
  • 具有自定义帖子类型和自定义分类的 WordPress 固定链接

    我有一个名为 产品 的自定义帖子类型和一个名为 product types 的产品自定义分类法 它是分层的 因此其中有子类别 我希望永久链接显示为http mysite com product type sub category postn
  • 如何在 Gulp 中使用 Browserify 丑化输出?

    我尝试在 Gulp 中丑化 Browserify 的输出 但它不起作用 gulpfile js var browserify require browserify var gulp require gulp var uglify requi
  • get_dummies(),异常:数据必须是一维的

    我有这个数据 我正在尝试应用这个 one hot pd get dummies df 但我收到这个错误 这是我到目前为止的代码 Import modules import pandas as pd import numpy as np im
  • Java 8 映射到对象列表,其中一个字段分组为一个列表

    新手问题 我有一个来自数据库的原始 bean 逐行为 public class DataBean private Integer employeeId private String org private String comments C
  • 如何过滤掉文件中所有唯一的行?

    有没有办法通过命令行工具过滤掉文件中的所有唯一行而不对行进行排序 我基本上想这样做 sort u myFile 没有排序的性能影响 删除重复行 awk a 0 file 这是著名的 awk 一行语句 inet 上有很多解释 Here htt
  • 在 testthat 中测试确切的字符串

    我想测试我的函数之一是否给出特定消息 或警告或错误 good lt function message Hello bad lt function message Hello 我希望第一个期望成功 第二个期望失败 library testth
  • NHibernate QueryOver:在子查询中使用 group by 获取行计数

    我试图从带有 group by 的查询中获取计数 但不知道如何将我想要的 SQL 转换为 NHibernate 的 QueryOver 语法 这是 SQL select count from select Email from Entry
  • REGEX - PHP 仅获取字符串中的粗体部分

    我是正则表达式的新手 我有一个像这样的字符串 Hello b ABCD b World or b ABCD b Hello World 我基本上想保留粗体标签内的文本 但删除字符串中的所有其他字符 我找到了删除字符串中粗体部分的代码 str
  • 使用值转换器时如何查询实体框架核心中的实际值?

    我们有一个相当简单的情况 其中 EF Core 实体包含一个我们映射到字符串的值对象 builder Property gt Nummer HasConversion i gt i ToString i gt ZijdeNummer Fro
  • Java获取Referer URI?

    我想要与完全相同的方法获取请求URI http docs oracle com javaee 6 api javax servlet http HttpServletRequest html getRequestURI 28 29 但我想在
  • 有没有什么方法可以让javascript循环休眠?

    例如 有一个 for 循环 我想休眠几秒钟 each para res function index item Sleep 100 我知道我可以使用 setTimeout 或 setInterval 但它们都是异步的 循环将继续 如果我这样
  • 套接字 Python 3.5:套接字服务器在文件接收时永远挂起

    我正在尝试编写一个Python程序 如果客户端连接到服务器 它可以浏览目录并通过套接字抓取文件 浏览部分工作正常 它打印出客户端的所有目录 这是代码的一部分 with clientsocket print Connected to addr
  • 可安装的触发器因测试附加组件而失败

    几天来我一直在努力解决可安装的触发器问题 我的所有研究表明 附加组件应该允许在电子表格中安装可安装的 onEdit 触发器 但我的尝试不断出错 我稍微简化了我的项目代码来举例说明我的问题 错误信息 执行失败 测试加载项尝试执行不允许的操作
  • jQuery UI DatePicker 仅显示年份

    我正在使用 jQuery datepicker 来显示日历 我想知道是否可以使用它来仅显示 Year 而不是完整的日历 NOTE 如果有人反对 为什么我现在回答这个问题 因为我尝试了这篇文章的所有答案 但没有得到任何解决方案 所以我尝试了自
  • Hibernate 和 JDBC 性能? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 对于 Pandas 数据框中的每一行,确定另一列中是否存在列值

    我有一个像这样的熊猫数据框 df pd DataFrame category A B C A category pred A B D A B C D print df category category pred 0 A A 1 B B D
  • 在 Cocoa 应用程序中使用异常处理与 NSError

    大家好 我一直在阅读苹果关于何时 何地 如何使用 NSError 与 try catch finally 的建议 本质上 我的印象是苹果认为最好避免使用异常处理语言结构 除非作为在意外错误情况下停止程序执行的机制 也许有人可以举一个这种情况