Throwing simple errors


When do you write throws methods and when do you write methods that return optional. What makes you decide to go for throwing methods? I see some people on github write throwing methods everywhere and others use them less frequently.

Here is a simple way to throw errors from your methods. You can later refactor to use enums when your code is in a more production ready state.

extension String: Error {} /*Enables you to throw a string*/

extension String: LocalizedError { /*Adds error.localizedDescription to Error instances*/
    public var errorDescription: String? { return self }
}

func test(color: NSColor) throws{
    if color == .red {
        throw "I don't like red"
    } else if color == .green {
        throw "I'm not into green"
    } else {
        throw "I like all other colors"
    }
}

do {
    try test(color: .green)
} catch let error where error.localizedDescription == "I don't like red"{
    Swift.print ("Error: \(error)")//"I don't like red"
}catch let error {
    Swift.print ("Other cases: Error: \(error.localizedDescription)")/*I like all other colors*/
}

You can also simply do throw NSError(description: "Uh oh, an error happened", code: 0)`