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.
Desafio
FácilDefina 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
.negativequandon < 0 - Lança
.tooBigquandon > 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 { ... } ...
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
1Strings a Fundo
Contagem e ÍndicesCase e TrimBusca em StringsDivisão e JunçãoSubstituindo SubstringsRecapitulação - Verificação de Nome de Usuário4Conjuntos
Criando ConjuntosUnião e InterseçãoSubtração e Diferença SimétricaSubconjunto e SuperconjuntoRecapitulação - Filtro de Tags7Projeto - Monitor de Hábitos
Visão Geral do ProjetoMarcar como Concluído10Projeto - Mecanismo de Quiz
Visão Geral do ProjetoFazer Perguntas2Intervalos e Strides
Fechado vs Meio-AbertoStrideMétodos de IntervaloIntervalos no SwitchRecapitulação - Grade de Calendário5Funções de Ordem Superior Parte 1
MapFilterReduceEncadeando map, filter, reduceRecapitulação - Estatísticas de Palavras3Dicionários
Declarando DicionáriosBusca OpcionalAtualizando DicionáriosIterando DicionáriosAgrupando ValoresRecapitulação - Inventário6Funções de Ordem Superior Parte 2
compactMapflatMapsorted(by:)Construindo PipelinesRecapitulação - Leaderboard9Tratamento de Erros
throws e Errordo, try, catchtry? e try!Propagando ErrosRecapitulação - Calculadora Segura