2016-04-26 4 views
0

Ich habe gerade angefangen, Swift vor ein paar Tagen zu lernen. In meinem Xcode Spielplatz habe ich den folgenden Code:Swift 2.2 Fehlerbehandlung durch Versuch Block

//: Playground - noun: a place where people can play 

import UIKit 

enum VendingMachineError: ErrorType { 
    case InvalidSelection 
    case InsufficientFunds(coinsNeeded: Int) 
    case OutOfStock 
} 


func requestBeverage(code: Int, coins: Int) throws { 
    guard code > 0 else { 
     throw VendingMachineError.InvalidSelection 
    } 
    if coins < 2 { 
     throw VendingMachineError.InsufficientFunds(coinsNeeded: 3) 
    } 
    guard coins > 10 else { 
     throw VendingMachineError.OutOfStock 
    } 

    print("everything went ok") 
} 



try requestBeverage(-1, coins: 4) 
print("finished...") 

Wenn ich versuche, es auszuführen, passiert nichts. aber ich würde erwarten zu drucken "fertig ...", weil in meiner Logik, es versucht, etwas zu tun, scheitert, dann würde das Programm weiter ...

So ist die Frage, warum nicht das Programm fortgesetzt wird und wie kann ich den Code im Fehlerfall mit so wenig Worten wie möglich weitermachen?

Vielen Dank im Voraus

+0

ist „ging alles ok“ print ed? – glace

+0

@glace-Nr. ...... – OWADVL

+0

Sind Sie sicher, dass es Swift 3 ist? Swift 3 ist, soweit ich weiß, noch nicht einmal in der Beta-Phase (es wird nach der WWDC 2016 sein und wird wahrscheinlich gegen September veröffentlicht). Es ist wahrscheinlich Swift 2.2 (die aktuelle Version). – FreeNickname

Antwort

1

Sie können alle Fehler einzeln abfangen y mit do/catch:

do { 
    try requestBeverage(-1, coins: 4) 
} catch VendingMachineError.InvalidSelection { 
    print("Invalid selection") 
} catch VendingMachineError.OutOfStock { 
    print("Out of stock") 
} catch VendingMachineError.InsufficientFunds(let coinsNeeded) { 
    print("You need \(coinsNeeded) more coins") 
} catch { 
    // an unknown error occured 
} 

print("finished...") 

, Alternativ try? verwenden, wenn Sie nur interessieren, ob ein Fehler ausgelöst wird, aber nicht, welche:

func requestSomeBeverage() { 
    guard (try? requestBeverage(-1, coins: 4)) != nil else { 
     print("An error has occured") 
     return 
    } 
} 

requestSomeBeverage() 
print("finished...") 

Wenn Sie absolut sicher sind, wird ein Fehler nicht geworfen werden, und Sie wollen eine Ausnahme verursachen, wenn es nicht verwenden try! (aber in den meisten Fällen nicht):

try! requestBeverage(-1, coins: 4) 
print("finished...") 
1

Sie müssen den Fehler

... 

do { 
    try requestBeverage(-1, coins: 4) 
} catch { 
    print(error) 
} 
print("finished...") 

Siehe Error Handling im Swift Language Guide

bearbeiten fangen: Sie können den gesamten Ausdruck in einer Zeile schreiben können ;-)

do { try requestBeverage(-1, coins: 4) } catch { print(error) } 
+0

ok, aber Ihre Lösung hat 6 Zeilen Code. Gibt es etwas in ... 1-2 Zeilen? – OWADVL

+0

Eigentlich gibt es 4 (!) Mehr Zeilen. Was stimmt damit nicht? Natürlich können Sie die "do" - und die "catch" -Klausel jeweils in eine Zeile setzen, was aber die Performance nicht wirklich beschleunigt ;-) – vadian

+1

@OWADVL Sie können 'try!' Oder 'try?' Immer verwenden, wenn Sie will weniger Codezeilen ... –