Introdução: por que este tópico explode no Stack Overflow?
\n\nSe 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\nA 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\nNeste 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
whennocatche quando usar o bom e velhoif\n - Exemplos reais de código em produção \n
Vamos lá!
\n\nO problema: onde está meu multi-catch?
\n\nEm Java você escreve simplesmente:
\ntry {\n riskyOperation()\n} catch (IOException | SQLException e) {\n // trata igualmente\n}\n\n\nBonito, conciso, claro. Mas no Kotlin essa sintaxe não existe. Se você tentar escrever catch (IOException | SQLException e), o compilador dirá "não".
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\nVamos ver três maneiras principais.
\n\nMétodo 1: múltiplos blocos catch (o mais óbvio)
\n\nO caminho mais simples é adicionar vários blocos catch em sequência. O Kotlin suporta isso perfeitamente.
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\nVantagens:
\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
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
Método 2: catch com when (elegante e flexível)
\n\nAqui é onde o Kotlin mostra todo seu potencial. Em vez do multi-catch, você pode usar when dentro de um único bloco catch.
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\nEssa 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
Aqui está um exemplo mais avançado com condições:
\n\ntry {\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 ->