作为具有 java 背景的开发人员,我习惯于经常捕获异常以防止它们使我的应用程序崩溃。这包括各种委托方法。只是针对意外情况的额外安全措施。
我的问题是这种方法在目标 c 中是否明智,它是否会引入某种性能问题?换句话说,如果我更频繁地使用 try/catch 块,我的应用程序会受到任何影响吗?
作为具有 java 背景的开发人员,我习惯于经常捕获异常以防止它们使我的应用程序崩溃。这包括各种委托方法。只是针对意外情况的额外安全措施。
我的问题是这种方法在目标 c 中是否明智,它是否会引入某种性能问题?换句话说,如果我更频繁地使用 try/catch 块,我的应用程序会受到任何影响吗?
它不会那么痛苦,但你必须记住一些事情。与您可能拥有的其他语言不同ConnectionRefusedException
,FileNonexistantException
在 Objective-C 中,异常在 90% 的情况下都是程序员错误。因此,当您的应用程序投入生产时,它不应该有任何异常。例如,与其捕获越界异常,不如在尝试之前查看数组长度。您可以进行顶级尝试捕获,以防万一出现错误并比崩溃更优雅地退出。
通常,您不希望在程序运行时发生异常。因此,在错误发生之前对其进行测试而不是在错误发生后捕获它们被认为是更好的编程实践。
测试方法中的错误并返回一些值作为错误指示器也比抛出异常更好。抛出异常会占用大量系统资源,因此,
Apple 通常建议不要使用它们不必要的用途(例如,您不想仅仅因为无法打开文件而引发异常)。
最好的做法是,仅在加载数据、模块、文件以及由于用户环境设置或用户提交的数据而可能无法正常工作的事物时才使用 try 和 catch。
仅将 tty/catch 用于异常,而不是作为 if/then 的替代品。开销非常昂贵。
异常就是异常,不应该经常发生:)),所以它根本不会影响性能。
通常协议包含正常行为和错误的委托方法[例如didLoadResponse: theResponse
,didFailWithError: theError
],因此将涵盖所有情况。
我会保留例外情况,例如写入磁盘时出错或远程服务器关闭 - 实际上会破坏应用程序的情况。
你会遇到性能问题。如果抛出异常,那在调试程序时很好。但是当应用程序在那里运行时,你可能不希望发生这种情况。
我的建议是仅将异常用于调试,然后在发布时禁用它们,然后使用更合适的方法,如 NSError。
假设用户输入了一个 URL 并且这个 URL 无效。你必须加载一个网页。在调试期间你可能只是抛出一个异常,但是当你发布时你可以忽略错误的 URL,并且不要显示页面,或运行 NSAlertPanel 以显示错误。
我只是在 iPad 上做了一些测试。除非实际抛出异常,否则 @try/@catch 块似乎很少引入性能损失。但是如果抛出异常,惩罚是巨大的。你没有说你正在使用什么环境。所以你的里程可能会有所不同。