swift - websiteUp 设置为 false,但不打印失败
问题描述
我正在尝试学习 Swift/Xcode,但遇到了一个我无法解释的错误。
这是一些应该打印错误代码的代码,但即使我已将 websiteUp 更改为 false,仍然会打印 Success!
enum WebpageError: Error {
case success
case failure(Int)
}
func getWebpage(uRL: String, siteUp: Bool) throws -> String {
if siteUp == false {
WebpageError.failure(404)
}
return "Success"
}
let webpageURL = "http://apple.com"
let websiteUp = false
do {
let status = try getWebpage(uRL: webpageURL, siteUp: websiteUp)
print(status)
} catch {
print(error)
}
我看不出有什么问题,因为在我看来一切正常!
解决方案
你正在做两件愚蠢的事情:
case
错误枚举的 a怎么可能是 a.success
?是为了失败!光说 是不够的
WebpageError.failure
。你必须throw
犯错误。
所以:
enum WebpageError: Error {
case failure(Int) // <== look
}
func getWebpage(uRL: String, siteUp: Bool) throws -> String {
if !siteUp {
throw WebpageError.failure(404) // <== look
}
return "Success"
}
let webpageURL = "http://apple.com"
let websiteUp = false
do {
let status = try getWebpage(uRL: webpageURL, siteUp: websiteUp)
print(status)
} catch {
print(error)
}
说了这么多,让我们回到你为什么包含一个.success
案例的问题。也许您的想法是返回一个表明成功或失败的值。那将是一个结果。像这样:
enum WebpageError: Error {
case failure(Int)
}
func getWebpage(uRL: String, siteUp: Bool) -> Result<String,Error> {
return Result {
if !siteUp {
throw WebpageError.failure(404)
}
return "Success"
}
}
let webpageURL = "http://apple.com"
let websiteUp = false
let status = getWebpage(uRL: webpageURL, siteUp: websiteUp)
do {
try print(status.get())
} catch {
print(error)
}
这可能比你在这个阶段想象的更复杂,但值得考虑。
推荐阅读
- c++ - strncpy 后 char 数组的错误行为
- php - 如何在 php 中运行 powershell 命令列表?
- roslyn - 如何使用 Roslyn 将函数插入到 VB.NET 中的类中
- visual-studio-code - 禁用无标题编辑器改进 - 标题中的第一行名称
- java - 如何打印字符串的每三个字符?爪哇
- regex - 如何使用 RegEx 匹配 SQL Server 或 BigQuery 中的记录(标准方言)
- sql-server - T-SQL 生成 XML
- reactjs - AWS Cognito 中多种用户类型的最佳实践?
- android - MainActivity 可以像 Android/Wear OS 中的 WearableListenerService 那样运行吗
- bash - 最后一个函数的 Bash 测试值等于零