Tod*_*orf 8 java macos cocoa porting objective-c
我工作的一个移植代码库的Java可可/ Objective-C的用于台式机Mac OS X的Java代码中使用了大量的和大量的与像checked异常的方法:
double asNumber() throws FooException {
...
}
Run Code Online (Sandbox Code Playgroud)
在Objective-C中表示这些的最佳方法是什么?例外或错误输出参数?
- (CGFloat)asNumber {
... // possibly [FooException raise:format:];
}
Run Code Online (Sandbox Code Playgroud)
要么
- (CGFloat)asNumberError:(NSError **)outError {
...
}
Run Code Online (Sandbox Code Playgroud)
我觉得out-errors通常是Objective-C的更好解决方案,但正如你所看到的......很多像上面那样的方法看起来很尴尬.而且,还有很多这些.
当然要记住,由于这些是Java 中的检查异常,我需要在调用这些方法的地方添加@try块或if (*outError) {...}检查(很多地方).
我记得听说虽然@try在Objective-C中输入块曾经是昂贵的,但它在64位或SL或其他一些新的环境中是便宜的(不记得确切).我完全不关心向后兼容性,所以我绝对愿意只为新的热度而设计.
Qui*_*lor 16
你应该避免例如解析字符串中的数字之类的异常.在Objective-C中,异常表示程序员错误,而不是用户输入错误,甚至是不可用的文件.(部分原因是异常处理总是比更"常规"的错误处理更加昂贵和复杂.无论在64位中输入@try块是"零成本"这一事实,只要实际引发异常,它仍然很慢.当然,你可以随意使用异常,但这不是Cocoa方式,你会发现自己与其他Objective-C代码不一致.使用您的代码的人会非常恼火,因为您会在导致错误的情况下抛出异常.
来自Apple自己的文档:
"在许多环境中,使用异常是相当普遍的.例如,您可能会抛出异常来表示例程无法正常执行 - 例如当文件丢失或数据无法正确解析时.例外是资源密集型的在Objective-C中.您不应该使用异常来进行常规流控制,或者只是表示错误.相反,您应该使用方法或函数的返回值来指示发生了错误,并提供有关问题的信息.错误对象."
看看内置的Cocoa类如何处理这样的错误.例如,NSString有类似的方法-floatValue,如果失败则返回0.针对您的特定情况的更好解决方案可能是NSScanner如何执行此操作,例如in -scanFloat:- 接受指向应存储结果的字段的指针,并返回YES或NO基于解析是否成功.
除了Obejctive-C约定和最佳实践之外,NSError比NSException更加健壮和灵活,并且允许调用者在需要时有效地忽略该问题.我建议阅读错误处理编程指南Cocoa.注意:如果您接受NSError**参数,我强烈建议您还设计允许客户端通过,NULL如果他们不想收到任何错误信息.我知道的每个Cocoa类都会出错,包括NSString.
虽然移植的代码最终可能看起来与Java代码完全不同,但要认识到它将由Objective-C代码使用,而不是Java等效的客户端.绝对匹配语言的习语.该端口不是Java代码的镜像,但结果会更加正确(对于Objective-C).
在Cocoa中,异常实际上只应该用于"编程错误"; 理念是让应用程序捕获它们,让用户选择保存他们正在做的事情,然后退出.首先,并非所有框架或代码路径都可以100%异常安全,因此这可能是唯一安全的操作过程.对于可以预期和恢复的错误,您应该使用NSError,通常通过out-parameter.
| 归档时间: |
|
| 查看次数: |
1315 次 |
| 最近记录: |