如何在Swift中捕获算术溢出错误?

如何在Swift中捕获算术溢出错误?,swift,error-handling,integer-overflow,Swift,Error Handling,Integer Overflow,这个可能很简单。我们知道运算符&+对整数进行模运算(环绕),而运算符+会导致错误 $ swift 1> var x: Int8 = 100 x: Int8 = 100 2> x &+ x $R0: Int8 = -56 3> x + x Execution interrupted. Enter Swift code to recover and continue. 这是什么样的错误?我抓不到它,也不能把它交给一个可选的: 4> do {try x

这个可能很简单。我们知道运算符
&+
对整数进行模运算(环绕),而运算符
+
会导致错误

$ swift
  1> var x: Int8 = 100
x: Int8 = 100
  2> x &+ x
$R0: Int8 = -56
  3> x + x
Execution interrupted. Enter Swift code to recover and continue.
这是什么样的错误?我抓不到它,也不能把它交给一个可选的:

  4> do {try x + x} catch {print("got it")}
Execution interrupted. Enter Swift code to recover and continue.
  5> try? x + x
Execution interrupted. Enter Swift code to recover and continue.

我很确定这种错误和(a除以0)的错误是一样的,但我不知道这种错误是否能被捕获。我错过了什么简单的东西?它能不能被困住?如果是,如何区分异常和运行时错误。将引发异常并可以捕获该异常。运行时错误会使程序停止运行。添加和获取溢出是一个运行时错误,简单明了。没什么可抓的

&+
这样的操作符的要点是,它不会出错,也不会告诉您有问题。这就是重点

如果您认为可能会溢出,并且想知道是否溢出,请使用静态方法,如
addWithOverflow
。它返回一个元组,由结果和一个Bool组成,说明是否存在溢出

var x: Int8 = 100
let result = x &+ x // -56

x = 100
let result2 = Int8.addWithOverflow(x,x) // (-56, true)

看起来这已经成为Swift 5中的非静态方法

那么比如说,

UInt8.max.addingReportingOverflow(1)
将返回
(partialValue:0,overflow:true)
有关

当然,以
&
开头的普通算术运算符允许溢出而不返回溢出报告

UInt8.max&+1

将返回
0
作为
UInt8

谢谢,我知道这不是抛出的错误(正如你所说的例外,尽管苹果似乎避免使用该术语),因为它无法被捕获;我想知道是否有什么方法可以“套住它”。可能是Swift中的运行时错误是不可检测的;这将是一个很好的答案。我只是找不到任何明确说明事实的信息。你有推荐人吗?我想我本可以把这个问题说得更好。我想确定这些无法处理。未捕获的异常是运行时错误。但并非每个运行时错误都是可捕获的异常。当文档告诉你某件事“是运行时错误”时,他们是在告诉你,做这件事你永远也逃不掉;它会使你的程序停止运行。例如,超出范围是一个运行时错误。顺便说一句,我理解你的问题(在你的评论中),但我只能告诉你这是一个设计决策。我曾讨论过为什么他们没有把“超出范围”这样的事情作为一个明显的例外,答案超出了我的工资等级;这似乎太贵了。你需要和一位计算机科学家谈谈,以了解更多信息。:)或者你可以相信我。:)无论如何,我希望您理解我的观点:所有运行时错误都可能被捕获的想法一点也不愚蠢,许多语言都是这样工作的。(你可能已经知道了。)但是Objective-C和Swift不知道。在类似于超出范围的情况下,使用一些特殊的语法表示“我愿意为此付出额外的代价,请让我抓住它,而不是破坏我的程序。”这将是非常酷的。事实上,这就是他们对整数溢出所做的。但是对于其他的东西,比如超出范围,没有类似的事情。@ThomasTempelmann这是一个长期存在的抱怨,在Swift 4中得到了解决,所以升级到Xcode 9就好了