- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Apple 的并发编程指南中,NSOperation 子类示例(非并发和并发变体)使用异常处理,我想知道为什么他们在操作中鼓励这种风格。
list 2-4 响应取消请求
- (void)main {
@try {
BOOL isDone = NO;
while (![self isCancelled] && !isDone) {
// Do some work and set isDone to YES when finished
}
}
@catch(...) {
// Do not rethrow exceptions.
}
}
我的理解是,异常处理通常不是 Objective-C 代码中的常见做法 - 异常本质上是程序员错误,应该会导致应用程序崩溃,而意外输入最好由 NSError 处理。 (我可能被误导的理解来自 this 和 this 之类的东西)
我想知道 NSOperations 是否提出了异常处理很重要的特定情况,或者这是否是该指南的特定作者更喜欢的风格。
作为旁注,一些 NSOperation 示例代码遵循这种风格,其他示例则没有。大多数高知名度的 OSS 不使用异常(例如 AFNetworking)。
最佳答案
你的理解是正确的——NSError(或类似的)应该用来传达错误信息,而不是异常。大多数 Objective-C 代码都不是异常安全的,至少会泄漏资源。作为一般规则,永远不要让您的代码将异常泄漏到其他任何人的代码中——无论是 Apple 的还是第三方的。一些第 3 方框架可能明确表明它们是异常安全的,但这种情况很少见。
根据该原则,您可以明白为什么无论如何都应该在 main
方法中包含一个包罗万象的异常处理程序。但实际上还有另一个原因:您的操作将在专用线程上运行。从您的操作中抛出的异常将传播到堆栈中,但不会传播得更远。操作的逻辑调用者或所有者不会得到它们,因为它们在不同的线程上运行(或根本不运行)。所以泄漏的异常要么杀死你的整个程序,要么在没有其他迹象的情况下被静静地吞噬。然后您的程序可能会陷入一种奇怪的状态 - 由于您没有意识到发生了错误,您可能会继续等待永远不会到达的操作结果。
此外,Apple 在 Concurrency Programming Guide 中有一个部分他们在哪里谈论Handling Errors and Exceptions .他们关于“离散实体”的第一点是暗指我在上一段中所说的:
Handling Errors and Exceptions
Because operations are essentially discrete entities inside your application, they are responsible for handling any errors or exceptions that arise. In OS X v10.6 and later, the default start method provided by the NSOperation class does not catch exceptions. (In OS X v10.5, the start method does catch and suppress exceptions.) Your own code should always catch and suppress exceptions directly. It should also check error codes and notify the appropriate parts of your application as needed. And if you replace the start method, you must similarly catch any exceptions in your custom implementation to prevent them from leaving the scope of the underlying thread.
Among the types of error situations you should be prepared to handle are the following:
- Check and handle UNIX errno-style error codes.
- Check explicit error codes returned by methods and functions.
- Catch exceptions thrown by your own code or by other system frameworks.
- Catch exceptions thrown by the NSOperation class itself, which throws exceptions in the following situations:
- When the operation is not ready to execute but its start method is called
- When the operation is executing or finished (possibly because it was canceled) and its start method is called again
- When you try to add a completion block to an operation that is already executing or finished
- When you try to retrieve the result of an NSInvocationOperation object that was canceled
If your custom code does encounter an exception or error, you should take whatever steps are needed to propagate that error to the rest of your application. The NSOperation class does not provide explicit methods for passing along error result codes or exceptions to other parts of your application. Therefore, if such information is important to your application, you must provide the necessary code.
关于objective-c - 为什么 NSOperation 示例代码使用 @try & @catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671028/
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!