Capturando com tryCatch()
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 53 de 64.
tryCatch(expr, error = function(e) ...) executa expr. Se ele gerar um erro, o manipulador será executado em seu lugar e seu valor se tornará o resultado, e o script continuará:
safe_sqrt <- function(x) {
tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")Saída:
[1] 4
[1] NA
[1] "still running"O manipulador recebe o erro como e, e conditionMessage(e) retorna o texto da mensagem:
result <- tryCatch(
stop("file not found"),
error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)Saída:
[1] "Problem: file not found"Envolva apenas a chamada que pode falhar e capture o erro onde você possa fazer algo útil, como fornecer um valor padrão ou uma mensagem para o usuário:
to_number <- function(s) {
tryCatch({
if (s == "") stop("empty input")
as.integer(s)
}, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))Saída:
[1] 42
[1] -1Em um loop, tryCatch() permite que um item inválido falhe enquanto os outros continuam sendo processados:
inputs <- list(4, "x", 9)
for (v in inputs) {
r <- tryCatch(sqrt(v), error = function(e) "not a number")
cat(format(v), "->", r, "\n")
}Saída:
4 -> 2
x -> not a number
9 -> 3 Desafio
FácilComplete safe_divide(a, b). Use tryCatch(): dentro dele, gere o erro division by zero quando b for 0 e, caso contrário, calcule a / b. O manipulador retorna Error: seguido pela mensagem. Retorne o resultado arredondado para duas casas decimais como texto, 3.33, ou o texto do erro.
O código fornecido lê pares de números, como 10/3, separados por vírgulas, e imprime o resultado de cada par em sua própria linha.
Experimente você mesmo
safe_divide <- function(a, b) {
# Escreva seu código aqui
""
}
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
for (pair in strsplit(input[1], ",")[[1]]) {
p <- as.numeric(strsplit(pair, "/")[[1]])
cat(safe_divide(p[1], p[2]), "\n", sep = "")
}
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 em Profundidade
Substrings com substr()Formatação com sprintf()Dividindo e UnindoPesquisando StringsSubstituindo TextoRecapitulação - Criador de Nome de Usuário4Matrizes
Criando MatrizesIndexando MatrizesResumos de Linhas e ColunasAritmética de MatrizesRecapitulação - Tabela de Assentos10Fluxo de Controle Avançado
A Função switch()ifelse() Vetorizadorepeat e breakFunções RecursivasRevisão — Classificador de Notas2Consultas de Chave-Valor
Consultas em Vetores NomeadosVerificando ChavesAdicionando e Removendo ChavesPercorrendo NomesRecapitulação - Mesa de Ações5Projeto - Boletim de Notas
Adicionando AlunosRegistrando Notas8Ordenação e Agrupamento
Ordenando VetoresOrdenando por uma ChaveAgrupando com split()Resumos de GruposRecapitulação - Tabela de Classificação11Tratamento de Erros
Gerando Erros com stop()Capturando com tryCatch()Avisos e finallyValidando a EntradaRecapitulação - Calculadora Segura3Conjuntos e Contagem
Valores ÚnicosOperações com ConjuntosTestes de PertinênciaContagem com table()Recapitulação - Convidados do Evento6Funções como Valores
Funções AnônimasPassando FunçõesRetornando FunçõesClosures com EstadoRecapitulação - Regras de Desconto9Data Frames
Criando Data FramesColunas e LinhasFiltrando LinhasAdicionando e OrdenandoRecapitulação - Relatório de Vendas12Projeto - Rastreador de Despesas
Registro de DespesasGastos TotaisPratique por conta própria: Compilador de R online