- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
Cocoa 异常策略背后的基本原理是什么——或者为什么只对程序员错误使用异常?
我知道异常曾经是相当昂贵的,所以人们不想过度使用它们。但这随着现代运行时而改变,它是零成本异常。我也明白使用异常来进行一般控制流并不是一个好主意,因为它可能导致代码很难理解。
但是为什么要使用异常来指示程序员的错误呢?对于这种情况,记录一条消息后跟 abort()
应该就足够了。为什么我应该编写一个 @catch(...)
block 来处理程序员错误而不是修复实际错误?我一直在思考这个问题,但我还没有发现对程序员错误的异常的任何合理使用。
(作为旁注/问题:我已经编写了一个递归下降解析器,并且我计划在那里使用异常来处理错误。对我来说似乎比为每个单独的添加一个 out 参数更合理在那里运行并手动检查所有地方的错误。当然,我会捕获我在从外部调用的顶级方法中抛出的任何异常。有人认为这是对异常的不良使用吗?)
感谢您到目前为止的所有回答。它们都是真的,但实际上并没有回答我的问题。所以我想我不是很清楚,对此感到抱歉。所以这是真正的问题:
为什么 Cocoa 会为程序员错误(或断言)抛出异常? 不应该捕获它们,实际上编写代码来处理调用堆栈中某个地方的程序员错误并不是无论如何是个好主意。在我看来,异常(exception)是一种浪费。只需记录错误并调用 abort()
(退出程序)就足够了。那么实际抛出异常有什么好处呢?
我理解为什么通常不使用和不鼓励使用异常 - Cocoa 的大部分内容都不是异常安全的。这不是这里的问题。我希望我现在说清楚了。
最佳答案
Why should I write a
@catch(...)
block to handle a programmer error instead of fixing the actual mistake?
在大多数情况下,您不会。在 Objective-C 中,您通常不处理异常。如果发生异常,它会导致崩溃,然后您修复该错误——希望您能在测试期间发现这一点。
当然,在某些情况下这是行不通的。也许你做除了异常并且你可以解决它,所以你捕获它。或者有一些罕见的 API 会抛出异常而不是使用错误对象。
老实说,我很少在我的 Objective-C 代码中使用 try/catch。
至于基本原理,我认为这主要是由于 Objective-C 的 C 继承。早在 80 年代初开发 Objective-C 时,异常就有点"new"(即,还没有出现在许多主流语言中),而 Objective-C 更迎合了使用 NULL
的 C 传统或用于指示错误的输出参数。
关于objective-c - Cocoa 异常策略背后的基本原理是什么——或者为什么只对程序员错误使用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811620/
在 PHP 中,开始破解并弄清楚页面上发生的事情非常容易。只需输入一堆回声和 print_r,仅此而已。看来这种技术在 python 中对我不起作用。我通过在 python 照片上传模块中进行黑客攻击
程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1、
上图的意思: 百战百胜,屡试不爽. 故事 程序员小张: 刚毕业,参加工作1年左右,日常工作是CRUD 。 架构师老李: 多个大型项目经验,精通各种开发架构屠龙宝术;
周末了开心一下 谈到程序员,对于外行人来说一贯的印象就是格子衫大裤衩外加人字拖,蓬头(秃头)垢面黑眼圈,还有就是“人傻钱多死得快”🤣,这是外界对程序员固有的思想,但是作为新世纪的程序员,我们可没那么
我从事C++编程已有5年了,现在我意识到知道如何“不同地”思考的值(value)。 这个问题适用于尝试其他编程语言并遇到过类似情况的C++程序员: “哇,这太酷了!我不知道我可以那样编程。” “哇,我
互联网已经渗入我们生活的方方面面,于是我们就免不了会思考:如果有一天网络断了怎么办呢? 英国 Cable.co.uk 曾进行了一项有趣的"断网"调查,调查发现在 2500
这些是 “程序员可见” x86-64 寄存器: (来源:usenix.org) 隐形寄存器呢?刚刚才知道MMU寄存器,Interrupt Descriptor Table(IDT)使用了这些不可见的寄
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
有没有办法将 Dragon NaturallySpeaking 合并到事件驱动程序中?如果我使用 DNS 记录用户语音输入而不将其写入屏幕并直接保存为 XML,我的老板会非常喜欢它。我已经研究了好几天
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: 关闭12年前。 Possible Duplicate: Should I learn C before learning C++? 作为一名专业 (Java) 程序员和重
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在将一个使用串行端口的 C++ 程序(更准确地说是 Borland“组件”)“转换”为 Java。该程序使用一个线程来监听串行端口,并在收到给定的“事件字符”之一(可能是回车、ACK、NACK .
我是克里斯。我对编码很陌生,我不知道很多术语,这是我第三次也是最成功的学习 Java 的尝试。是的,如果我还年轻,效果就不太好。无论如何,我正在尝试创建游戏,但遇到了一个小问题。 我制作了一个 16
我是一名优秀的程序员,十分优秀!