如何从非抛出函数中捕获异常



如果这个问题对你来说很傻,很抱歉。我需要从power函数捕获溢出异常。我不能使用

do {
try pow(3, 100)
}
catch {
.....
}

Xcode显示pow没有throws的警告。如果我从代码中删除单词try,那么Xcode就会显示catch不可访问的警告。

知道可以用什么吗?

不能对不抛出的函数使用错误处理,因此trydo/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

最新更新