Menu
Coddy logo textTech

throws e Error

Parte da seção Lógica e Fluxo do Journey de Swift da Coddy — lição 44 de 56.

O Swift lida com erros fazendo com que as funções declarem que podem falhar. O corpo da função lança um valor de erro; o chamador deve tratá-lo.

Um tipo de erro é qualquer coisa que esteja em conformidade com o protocolo Error integrado. A maneira mais simples de declarar o seu próprio é com um enum:

enum InputError: Error {
    case empty
    case tooLong
}

Uma função que lança erros usa a palavra-chave throws em sua assinatura e a instrução throw em seu corpo:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

Você não pode chamar uma função que lança erros diretamente; o compilador força você a tratar o erro. A próxima lição explica como.

challenge icon

Desafio

Fácil

Defina um enum NumError: Error com dois casos: negative e tooBig.

Defina uma função que lança erros doubleSafely(_ n: Int) throws -> Int que:

  • Lança .negative quando n < 0
  • Lança .tooBig quando n > 100
  • Caso contrário, retorna n * 2

Leia um único número inteiro do stdin. Chame doubleSafely dentro de um bloco do/catch (você aprenderá a forma exata na próxima lição; por enquanto, use este esqueleto exato):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

Para a entrada 10, a saída é ok: 20. Para -1, é negative. Para 500, é too big.

Folha de consulta

Defina tipos de erro usando um enum em conformidade com Error:

enum InputError: Error {
    case empty
    case tooLong
}

Marque uma função como lançadora de erros com throws e use throw para lançar um erro:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

Funções que lançam erros devem ser chamadas com tratamento de erros (ex: do/catch); o compilador impõe isso.

Experimente você mesmo

let n = Int(readLine()!)!

// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo