ios - 如何从 Swift 类中抛出 NSError 并在 Objective-C 类中捕获它?
问题描述
我需要在 Objective-C 中实现一个 try-catch 结构来处理 Swift 抛出的 NSErrors。
我已经用 Swift 代码编写了一个 NetService 管理器,并且我正在一个已经存在的 Objective-C UI 上实现它。
但是,每当我从 Swift 类中抛出错误时,try-catch 结构都无法捕获错误并继续执行 finally 块。
快速错误定义:
enum NEONetServiceErrors: Int
{
case requestMadeWithoutIp
}
struct NEONetServiceErrorStrings
{
let requestMadeWithoutIp = ["NEONetService Error: Request made without IP": NEONetServiceErrors.requestMadeWithoutIp]
}
快速错误抛出:
@objc func requestHelloPage() throws
{
if serviceiPAddress != nil
{
makeHelloRequest()
}
else
{
throw NSError(domain: errorStrings.domain, code: NEONetServiceErrors.requestMadeWithoutIp.rawValue, userInfo:errorStrings.requestMadeWithoutIp)
}
}
Objective-C 属性:
@property NEONetServiceManager* netServiceManager;
@property NSError* _Nullable __autoreleasing * _Nullable netServiceError;
Objective-C 错误处理:
- (IBAction)pressUpdateButton:(id)sender
{
@try
{
[self.netServiceManager requestHelloPageAndReturnError: self.netServiceError];
}
@catch (NSException *exception)
{
NSLog(@"Throwing");
}
@finally
{
NSLog(@"Finally");
}
}
输出:
2019-10-18 14:47:03.289268-0300 NEOFirmUpdate[16533:2389800] Start
2019-10-18 14:47:03.292696-0300 NEOFirmUpdate[16533:2389800] Finally
你能帮我弄清楚我在错误处理方面做错了什么吗?
解决方案
问题是 Swift 错误/Objective-C NSError 不是 NSException。您被配置为捕获 NSExceptions 但这无关紧要。
当 Swift 抛出一个错误时,在 Objective-C 中“捕捉”一个 NSError 的方法是通过NSError**
参数间接,就像它一直以来的做法一样。
NSError* err = nil;
BOOL ok = [self.netServiceManager requestHelloPageAndReturnError:&err];
if (ok) {
// proceed normally
} else {
// you got an error, it is sitting in `err`
}
(请注意 Swift 如何准确地提供 BOOL 结果,以便您可以实现正确的模式。)
推荐阅读
- mysql - 改进查询以根据没有联合的值连接其他表
- latex - 如何在乳胶中以斜体字体编写代码
- vba - 如果可能:如何编写一个 Word 宏来交换活动页面上两个文本框的内容?
- java - 如何在 Java / Android 中查找内存泄漏
- asp.net - 413 请求实体太大 - Web API
- javascript - mouserOver 上的动画元素以向下滑动
- python - 使用 pandas 合并多个 CVS 文件
- ruby-on-rails - Ruby on rails:分解一个大的 test_helper.rb
- c# - 我可以使用 C# selenium 上传文件吗?
- .net - PWA:保持用户登录