Error Handling in Swift 2

Mit Version 2 erhält Apples — auf der WWDC 2014 vorgestellte — Programmiersprache Swift ein Error Handling wie man es von anderen Sprachen wie C++ oder Java kennt.

In Objective-C wurde für die Fehlerbehandlung ein NSError-Objekt verwendet (NSError*); gleiches galt für Swift 1.x (NSError?). — In Swift 2 sieht es hingegen anders aus. Hier halten die Schlüsselwörter try, catch, do, throw und throws Einzug. Das bedeutet etwas mehr Arbeit bei der Implementierung einer Fehlerbehandlung, soll den Code aber auch lesbarer machen.

Folgendes Beispiel zeigt die Verwendung dieser Schlüsselwörter am Beispiel der Validierung einer Textfeld-Eingabe. Zunächst die Model-Dateien dieses Beispiel-Projekts: SoccerTeam.swift und SoccerTeamModel.swift.

Zunächst die Datei SoccerTeam.swift:

import Foundation

struct SoccerTeam {
    let name: String
}

Die Datei SoccerTeamModel.swift:

import Foundation

struct SoccerTeamModel {
    var name: String? // <- optional

    enum InputError: ErrorType {
        case MissingTeam
    }

    func newTeam() throws -> SoccerTeam {

        guard let name = name
            where name.characters.count > 0
            else {
                throw InputError.MissingTeam
        }
        return SoccerTeam(name: name)
    }
}

Wir Ihr sehen könnt, soll überprüft werden, ob der Benutzer den Namen einer Fußballmannschaft eingibt. Um hierauf eine Fehlerbehandlung anzuwenden, wird zunächst eine Enumeration (ErrorType Enumeration) definiert, die dem ErrorType Protocol entsprechen muss. Jeder case in so einer Enumeration stellt einen selbst erstellten Fehlertyp dar (hier: MissingTeam). Zur Erinnerung: In Objective-C wurde stattdessen im Falle eines Fehlers eine NSError-Instanz erzeugt.

Anschließend folgt die Syntax für die Überprüfung der Eingabe in der Methode

func newTeam() throws -> SoccerTeam

Beachtet hierbei die Verwendung der Schlüsselwörter throws und throw.

In ViewController.swift kann nun der Fehler abgefangen werden, wobei ich den notwendigen Code hier in der IBAction-Methode untergebracht habe:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var soccerTeamField: UITextField!

    var soccerTeamModel = SoccerTeamModel()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func submit(sender: UIButton) {

        soccerTeamModel.name = soccerTeamField.text

        do {
            try soccerTeamModel.newTeam()
            print("Successfully entered new team!")
        } catch SoccerTeamModel.InputError.MissingTeam {
            print("Missing Team!")
        } catch {
            print("An error occurred, please try again!")
        }
    }
}

Hier kommen die Schlüsselwörter try und catch zum Einsatz, die von einem do-Block umgeben werden müssen. Der Code ist selbstredend. Es wird mit try die Methode func newTeam() aufgerufen, die im Falle einer fehlenden Eingabe eine Fehlermeldung anzeigt. In diesem Fall wird eine Fehlermeldung mit print (in Swift 1.x hieß diese Funktion noch println) in der Konsole ausgegeben.

Eine ergänzende Anmerkung: Dieses Beispiel soll lediglich die Verwendung des Error Handling in Swift 2 verdeutlichen. Mir ist klar, dass es für die Validierung einer Eingabe bessere Möglichkeiten gibt als die Verwendung einer Fehlerbehandlung.

Zum Abschluss noch ein Wort zum Schlüsselwort guard, das ebenfalls in Swift 2 neu dazugekommen ist. Dieses Wort hängt mit if let und der Überprüfung eines Optionals zusammen (hier: var name: String?). Letztendlich kann guard anstelle von if let verwendet werden. Der Unterschied besteht aber darin, dass bei if let für den Fall, dass eine Property nicht nil ist, der entsprechende Code zuerst ausgeführt wird.

if let name = name {
    // name is not nil
} else {
    // name is nil
}

Bei guard liegt der Schwerpunkt auf der Situation, dass die Property nil ist. Dieser Code wird dann zuerst ausgeführt:

guard let name = name else {
    // name is nil
}

// name is not nil

Ob man nun if let oder guard verwendet, dürfte häufig eine Geschmacksfrage sein. Wenn Ihr weitere Ausführungen zu guard wünscht, empfehle ich Euch diesen Artikel von @CodingExplorer.

Den hier gezeigten Code könnt Ihr übrigens bei Github herunterladen.

Durch Benutzung dieser Website erklären Sie sich mit der Verwendung von Cookies einverstanden. Mehr Informationen

Die Verwendung von Cookies dient dazu, Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf diese Website zu analysieren. Außerdem werden Informationen zur Nutzung dieser Webseite an Partner für soziale Medien, Werbung und Analysen weitergegeben.

Schließen