A do block contains throwing work, and catch blocks handle matching errors.

Handle one known failure

do_catch.swift
enum LoginError: Error {
    case locked
}

func loginStatus(_ locked: Bool) throws -> String {
    if locked {
        throw LoginError.locked
    }
    return "signed in"
}

let accountLocked = 
let status: String

do {
    status = try loginStatus(accountLocked)
} catch LoginError.locked {
    status = "ask for reset"
}

print(status)
enum LoginError: Error {
    case locked
}

func loginStatus(_ locked: Bool) throws -> String {
    if locked {
        throw LoginError.locked
    }
    return "signed in"
}

let accountLocked = 
let status: String

do {
    status = try loginStatus(accountLocked)
} catch LoginError.locked {
    status = "ask for reset"
}

print(status)
do catch `do` marks the part of the program that may throw; `catch` describes the recovery path.