gpt4 book ai didi

objective-c - Foundation._GenericObjCError.NilError 是什么?

转载 作者:行者123 更新时间:2023-11-28 07:28:52 26 4
gpt4 key购买 nike

我正在从 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 ** 作为最后一个参数并返回一个 BOOLYES 表示成功。如果这按预期工作,则返回值只会在发生错误时为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com