2016-03-13 29 views
6

Questo è probabilmente facile. Sappiamo che l'operatore &+ esegue l'aritmetica modulare su numeri interi (avvolge), mentre l'operatore + causa un errore.Come si intrappolano gli errori di overflow aritmetico in Swift?

$ 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. 

Che tipo di errore è questo? Non riesco a prenderlo e non riesco a trasformarlo in un optional:

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. 

Sono abbastanza sicuro che questo tipo di errore è lo stesso tipo di errore da this StackOverflow question (una divisione per zero) ma non so se questo tipo di errore possa essere intrappolato. Che cosa mi manca? Può essere intrappolato o no? Se é cosi, come?

risposta

8

Distinguere tra un'eccezione e un errore di runtime. Un'eccezione viene lanciata e può essere catturata. Un errore di runtime interrompe il programma nelle sue tracce. Aggiungere e ottenere un overflow è un errore di runtime, chiaro e semplice. Non c'è niente da prendere.

Il punto di un operatore come &+ è che non presenta errori e non indica che si è verificato un problema. Questo è il punto.

Se pensi che potresti traboccare e vuoi sapere se lo hai fatto, usa metodi statici come addWithOverflow. Restituisce una tupla composta dal risultato e una Bool che dichiara se c'è stato un overflow.

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

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

Grazie, lo so che non è un errore di gettata (eccezione come dici tu, se Apple sembra evitare questo termine), in quanto non può essere catturato; Mi stavo chiedendo se c'è un modo per "intrappolarlo" comunque. Può darsi che gli errori di runtime in Swift non siano sostenibili; sarebbe una bella risposta. Non riesco a trovare alcuna informazione che dice esplicitamente che è così. Hai un riferimento? Credo che avrei potuto esprimere meglio la domanda. Mi piacerebbe sapere per certo che questi non possono essere gestiti. –

+0

Un'eccezione non rilevata è un errore di runtime. Ma non tutti gli errori di runtime sono un'eccezione intercettabile. Quando i documenti ti dicono che qualcosa "è un errore di runtime" ti stanno dicendo che non puoi mai fare a meno di fare questa cosa; fermerà il tuo programma morto. Ad esempio, out-of-range è un errore di runtime. – matt

+1

BTW Capisco la tua domanda (nel tuo commento), ma tutto quello che posso dirti è una decisione di progettazione. Ho avuto qualche discussione sul perché non rendessero le cose come fuori portata un'eccezione catchable, e la risposta era al di sopra del mio grado di paga; sembra che sarebbe troppo costoso. Avresti bisogno di parlare con un informatico per saperne di più. :) – matt