Como capturar várias exceções em Kotlin de uma vez: guia completo com código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que este tópico explode no Stack Overflow?

\n\n

Se você já programou em Kotlin e precisou capturar várias exceções diferentes, sabe que isso pode ser doloroso. Especialmente se você veio do Java, onde o multi-catch (catch (IOException | SQLException e)) é padrão desde o Java 7. No Kotlin é diferente, e muitos desenvolvedores ficam perdidos.

\n\n

A pergunta "How to catch many exceptions at the same time in Kotlin?" no Stack Overflow acumulou milhares de visualizações. E não é por acaso: tratamento de erros é algo que todos enfrentam. Hoje vamos resolver esse problema de uma vez por todas.

\n\n

Neste artigo você aprenderá:

\n
    \n
  • Por que o multi-catch no Kotlin não funciona como no Java
  • \n
  • Como capturar várias exceções de forma elegante e compacta
  • \n
  • Quando usar when no catch e quando usar o bom e velho if
  • \n
  • Exemplos reais de código em produção
  • \n
\n\n

Vamos lá!

\n\n

O problema: onde está meu multi-catch?

\n\n

Em Java você escreve simplesmente:

\n
try {\n    riskyOperation()\n} catch (IOException | SQLException e) {\n    // trata igualmente\n}\n
\n\n

Bonito, conciso, claro. Mas no Kotlin essa sintaxe não existe. Se você tentar escrever catch (IOException | SQLException e), o compilador dirá "não".

\n\n

Por quê? Porque o Kotlin optou pela clareza e pureza. Os desenvolvedores da linguagem decidiram que o multi-catch com barra vertical não é exatamente o estilo Kotlin. Mas isso não significa que você não pode capturar várias exceções. Apenas é feito de outra forma.

\n\n

Vamos ver três maneiras principais.

\n\n

Método 1: múltiplos blocos catch (o mais óbvio)

\n\n

O caminho mais simples é adicionar vários blocos catch em sequência. O Kotlin suporta isso perfeitamente.

\n\n
try {\n    val data = loadData()\n    processData(data)\n} catch (e: IOException) {\n    println("Erro de entrada/saída: ${e.message}")\n} catch (e: SQLException) {\n    println("Erro de banco de dados: ${e.message}")\n} catch (e: Exception) {\n    println("Erro desconhecido: ${e.message}")\n}\n
\n\n

Vantagens:

\n
    \n
  • Extremamente claro — cada tipo de exceção é tratado separadamente
  • \n
  • Permite lógica diferente para erros diferentes
  • \n
  • Ótima legibilidade para iniciantes
  • \n
\n\n

Desvantagens:

\n
    \n
  • Muita duplicação de código se a lógica de tratamento for a mesma
  • \n
  • Com 5+ exceções, o bloco fica volumoso
  • \n
\n\n

Método 2: catch com when (elegante e flexível)

\n\n

Aqui é onde o Kotlin mostra todo seu potencial. Em vez do multi-catch, você pode usar when dentro de um único bloco catch.

\n\n
try {\n    val result = fetchFromNetwork()\n    saveToDatabase(result)\n} catch (e: Exception) {\n    when (e) {\n        is IOException -> handleNetworkError(e)\n        is SQLException -> handleDatabaseError(e)\n        is SecurityException -> logAndNotify(e)\n        else -> throw e // relança se não souber tratar\n    }\n}\n
\n\n

Essa abordagem é uma verdadeira descoberta. Ela permite:

\n
    \n
  • Tratar diferentes exceções em um único lugar
  • \n
  • Usar todos os recursos do when, incluindo verificações de condições
  • \n
  • Adicionar facilmente novos tipos de exceção
  • \n
\n\n

Aqui está um exemplo mais avançado com condições:

\n\n
try {\n    connectToService()\n} catch (e: Exception) {\n    when {\n        e is IOException && e.message?.contains("timeout") == true -> \n            println("Timeout de conexão, tentando novamente")\n        e is IOException -> \n            println("Erro de rede: ${e.message}")\n        e is SQLException && e.errorCode == 1045 -> \n            println("Erro de autenticação no banco de dados")\n        else ->                

Blogs

Book Recommendations