gpt4 book ai didi

swift - 当抛出扩展它的错误时,如何正确辨别 Swift 中使用的基本错误是什么?

转载 作者:行者123 更新时间:2023-11-30 10:46:07 25 4
gpt4 key购买 nike

我正在寻找如何知道错误属于我的类型,AppError .

我基本上有一个定义为 class AppError<ErrorType>: Error { 的类.

然后我就这么做了

enum MyError {
case noApp
case noLabel
}

我的 throw 就像 throw AppError(type: MyError.noApp)

捕获后,我运行了一个遇到问题的方法......

static func handle(error: Error) {
print("App Error handled")
print(error);
let mine = error is AppError<Any>;
// This is always false
print(mine);
}

我试过AnyAnyObject作为通用,但它总是错误的。 error的打印总是看起来像 myapp.AppError<myapp.MyError>

我的目的是知道它是 AppError这样我就可以调用特定于它的方法。

实际上,我可能会遇到类似 ConnectionError 的错误, CreateError等等。所有这些都依赖于 AppError 。我希望我的处理程序知道传递的错误依赖于 AppError ,它有自己的自定义属性,而来自第三方库的一般错误则没有这些属性。

更新由于可能无法做到这一点,我尝试了以下方法:

class ErrorHandler {
static func handle(error: Error) {
print("App Error handled")
print(error);
switch error {
// List all AppError<Types> here since <Any> won't work
case is AppError<MyError>:
self._handleAppError(error: error)
default:
print("Generic Error")
print(error);
}
}

private static func _handleAppError(error: AppError<Any>) {
print("My error!");
print(error);
print(error.type);
}
}

问题是它提示 Cannot convert value of type 'Error' to expected argument type 'AppError<Any>即使它位于必须是该类型的行中。

最佳答案

我从你的另一篇文章中看到,你需要你的错误比普通枚举更灵活,所以我已经更新了它来做到这一点,仍然使用协议(protocol):

我认为你可以通过协议(protocol)来实现这一点:

protocol AppErrorProtocol: Error {
func handle()
}

struct AppError<ErrorType>: AppErrorProtocol {
let error: ErrorType
init(error: ErrorType) {
self.error = error
}
func handle() {
print(error)
}
}

enum MyErrors {
case one
}

func handleError(_ error: Error) {
print(type(of: error))
switch error {
case let error as AppErrorProtocol:
error.handle()
default:
print("Some other error \(error)")
}
}

handleError(AppError(error: MyErrors.one))
handleError(AppError(error: "foo"))

关于swift - 当抛出扩展它的错误时,如何正确辨别 Swift 中使用的基本错误是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55735127/

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