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的所有规则,但它们是可能的-用例子更新答案