Swift 如何从非抛出函数捕获异常?
对不起,如果这个问题对你来说很傻。我需要捕获幂函数中的溢出异常。我不能用Swift 如何从非抛出函数捕获异常?,swift,exception,Swift,Exception,对不起,如果这个问题对你来说很傻。我需要捕获幂函数中的溢出异常。我不能用 do { try pow(3, 100) } catch { ..... } Xcode显示警告,pow没有抛出。若我从代码中删除单词try,那个么Xcode会显示无法访问catch的警告 知道可以使用什么吗?您不能对不抛出的函数使用错误处理,因此try或do/catch的任何组合都将不起作用 在这种情况下,您可以做的是检查函数是否返回一个有效的数字,如 let value = pow(3, 1000) i
do {
try pow(3, 100)
}
catch {
.....
}
Xcode显示警告,pow
没有抛出
。若我从代码中删除单词try
,那个么Xcode会显示无法访问catch的警告
知道可以使用什么吗?您不能对不抛出的函数使用错误处理,因此
try
或do/catch
的任何组合都将不起作用
在这种情况下,您可以做的是检查函数是否返回一个有效的数字,如
let value = pow(3, 1000)
if value.isNaN {
//throw error or other error handling
}
您不能对不抛出的函数使用错误处理,因此
try
或do/catch
的任何组合都将不起作用
在这种情况下,您可以做的是检查函数是否返回一个有效的数字,如
let value = pow(3, 1000)
if value.isNaN {
//throw error or other error handling
}
如果愿意,您可以将pow转换为投掷功能:
enum NumericError: Error {
case notANumber
case infiniteNumber
}
func throwingPow(_ x: Decimal, _ y: Int) throws -> Decimal {
let v = pow(x, y)
if v.isInfinite {
throw NumericError.infiniteNumber
}
if v.isNaN {
throw NumericError.notANumber
}
return v
}
do {
try throwingPow(3, 100)
}
catch {
print(error)
}
这并不意味着所有可能的例外,只是一个例子。如果您想强制调用方将所有这些奇怪的情况看作是错误,那么使其成为抛掷功能有助于调用站点的人机工程学。
您可以从pow中获取NaN和无穷大值,例如:
let i = pow(Float.infinity, 1)
i.isNaN // false
i.isInfinite // true
let n = pow((0 / 0), 1)
n.isNaN // true
n.isInfinite // false
如果愿意,您可以将pow转换为投掷功能:
enum NumericError: Error {
case notANumber
case infiniteNumber
}
func throwingPow(_ x: Decimal, _ y: Int) throws -> Decimal {
let v = pow(x, y)
if v.isInfinite {
throw NumericError.infiniteNumber
}
if v.isNaN {
throw NumericError.notANumber
}
return v
}
do {
try throwingPow(3, 100)
}
catch {
print(error)
}
这并不意味着所有可能的例外,只是一个例子。如果您想强制调用方将所有这些奇怪的情况看作是错误,那么使其成为抛掷功能有助于调用站点的人机工程学。
您可以从pow中获取NaN和无穷大值,例如:
let i = pow(Float.infinity, 1)
i.isNaN // false
i.isInfinite // true
let n = pow((0 / 0), 1)
n.isNaN // true
n.isInfinite // false
我不认为
pow
可以抛出任何东西,即使是在Objective-C意义上。如果结果太大,你只能得到无穷大。改为检查无穷大如何?@Sweeper请在什么地方提出建议?在运行pow()之前,我不知道它会溢出。无法复制,pow(5,50)
给出88817841970012523233890533447265625
,而pow(3100)
给出51537752732011336461611297656212700000000000
,,假设您正在调用Decimal
重载。我认为pow
不会抛出任何东西,即使是在Objective-C意义上。如果结果太大,你只能得到无穷大。改为检查无穷大如何?@Sweeper请在什么地方提出建议?在运行pow()之前,我不知道它会溢出。无法复制,pow(5,50)
给出88817841970012523233890533447265625
,而pow(3100)
给出51537752732011336461611297656212700000000000
,,假设您正在调用Decimal
重载。'Decimal'类型的值没有成员'isNan'@giacoder简单拼写错误,已修复。这很有效,非常感谢“Decimal”类型的值没有成员“isNan”@giacoder简单拼写错误,已修复。这很有效,非常感谢!你知道在什么情况下,战俘的isNaN是真的,什么时候isInfinite是真的吗?在我的情况下,isNaN以巨大的力量返回了true。我想知道isInfinite什么时候会变为真。我不知道pow何时返回NaN或Infinite的所有规则,但它们是可能的-更新了答案并举例说明您知道在什么情况下pow的isNaN是真的,以及isInfinite何时是真的吗?在我的情况下,isNaN以巨大的力量返回了true。我不知道isInfinite什么时候会变成真的。我不知道pow何时返回NaN或Infinite的所有规则,但它们是可能的-用例子更新答案