- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从 Swift 调用一些旧的 Objective-C 代码,它经常会抛出这个错误,即使看起来没有任何问题:
do {
try objCObject.someMethod()
}
catch {
print(error)
// Trying to handle the error here
}
该方法的 Objective-C 签名是这样的:
- (BOOL) someMethodWithError: (NSError **) outError;
在 catch
中放置一个断点我可以使用 LLDB 控制台看到它。
(lldb) po error
Foundation._GenericObjCError.nilError
(lldb) po error as NSError
Error Domain=Foundation._GenericObjCError Code=0 "(null)"
这里发生了什么,我该如何处理?当我尝试在 Swift 中为此编写一个特例时,我得到了这个:
/Path/To/My Code.swift:200:27: error: module 'Foundation' has no member named '_GenericObjCError'
catch Foundation._GenericObjCError.nilError {
^~~~~~~~~~ ~~~~~~~~~~~~~~~~~
最佳答案
这是在 Objective-C 方法使用标准 Cocoa 方法抛出错误时引起的:将一个 NSError **
作为最后一个参数并返回一个 BOOL
和 YES
表示成功。如果这按预期工作,则返回值只会在发生错误时为 NO
,然后相应地设置 NSError **
对象。
Swift expects this成为所有具有此签名的 Objective-C 方法的工作方式。
您看到的是当这些方法之一由于某种原因出现异常并返回 NO
而未将 NSError **
参数设置为任何值(或明确地将其设置为 nil
)。
这可能是由于多种因素造成的,例如返回隐式转换为 BOOL
的错误代码(因此,0
成功代码被转换为NO
失败代码),或者以这样的方式编写其返回行,使其逻辑在成功时并不总是返回 YES
,或者因为实际上存在错误但作者不知道要将 NSError **
设置为什么,等等。
至于处理这个问题,这是我会做的:
在这种情况下,我认为最安全的做法是假设作者只是犯了一个错误并返回了错误的值。最好完全忽略抛出的错误。
do {
try objCObject.someMethod()
}
catch {
let nsError = (error as NSError)
if nsError.code == 0,
nsError.domain == "Foundation._GenericObjCError" {
print("Got invalid error from Objective-C")
}
else {
// Actually handle your error here
}
}
在这种情况下,将其视为作者记录的错误。如果需要,您可以调整上面的示例代码以专门处理此错误。
这很简单。只需更改您的方法,使其仅在您处于真正的错误状态时才返回 NO
,并始终确保 NSError **
对象已设置为有效如果调用者请求错误对象。
- (BOOL) someMethodWithError: (NSError **) outError {
[self.something attempt];
if (!self.something.succeeded) {
if (nil != outError) {
*outError = [self makeSomeDescriptiveErrorFromSomething: self.something];
}
return NO;
}
else {
return YES;
}
}
关于objective-c - Foundation._GenericObjCError.NilError 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55640917/
我正在尝试使用核心数据的批量删除功能。我有一个名为 Car 的实体。该实体的列名称 modelNumber 为 Int。我想删除所有型号早于 2000 的汽车。这是我的代码: func deleteC
我正在从 Swift 调用一些旧的 Objective-C 代码,它经常会抛出这个错误,即使看起来没有任何问题: do { try objCObject.someMethod() } catc
使用 SwiftUI 和 Core Data 给我带来了一个奇怪的问题。所以情况如下: 我有一个主视图“AppView”和一个名为“SubView”的 subview 。如果我单击 Navigatio
我是一名优秀的程序员,十分优秀!