1
resposta

Dica de erro JsonSyntaxException e IllegalStateException

Da época que foi feito essas aulas até a data atual, parece que tece uma mudança onde o código id 174 ao invés de retornar um objeto com a imagem dizendo que não encontrou o jogo, ele não retorna mais nada. No próprio Postman ele retorno o 404 e não mais o 200. O erro não está na criação do objeto jogo mas no consumo da API. Antes dessa refatoração a linha val meuInfoJogo = gson.fromJson(json, InfoJogo::class.java) precisava ficar dentro do runCatching. Após a refatoração a forma mais fácil que encontrei de resolver foi fazer esta alteração de onde começa o runCatching para que inclua val informacaoJogo = buscaApi.buscaJogo(busca):

package br.com.alura.alugames.main

import br.com.alura.alugames.modelo.Jogo
import br.com.alura.alugames.servicos.ConsumoApi
import java.util.*


fun main() {

    val leitura = Scanner(System.`in`)
    println("Digite o código do jogo: ")
    val busca = leitura.nextLine()

    val buscaApi = ConsumoApi()

    var meuJogo: Jogo? = null

    val resultado = runCatching {
        
        val informacaoJogo = buscaApi.buscaJogo(busca)

        meuJogo = Jogo(informacaoJogo.info.title, informacaoJogo.info.thumb)

    }

    resultado.onFailure {
        println("Jogo não encontrado. Tente outro id.")
    }

    resultado.onSuccess {
        println("Deseja inserir descrição personalizada? S/N")
        val opcao = leitura.nextLine()
        if (opcao.equals("s", true)) {
            println("Insira a descrição personalizada para o jogo:")
            val descricaoPersonalizada = leitura.nextLine()
            meuJogo?.descricao = descricaoPersonalizada
        } else {
            meuJogo?.descricao = meuJogo?.titulo
        }
        println(meuJogo)
    }

}
1 resposta

Olá! Tudo bem?

Parece que você está enfrentando um problema com a manipulação de exceções ao consumir uma API que agora retorna um erro 404 em vez de 200 quando um jogo não é encontrado. A mudança no comportamento da API pode causar exceções, como JsonSyntaxException e IllegalStateException, quando o JSON esperado não é retornado.

A solução que você encontrou, de incluir a chamada val informacaoJogo = buscaApi.buscaJogo(busca) dentro do runCatching, é uma boa abordagem para capturar exceções que podem ocorrer durante a execução desse código. Isso ajuda a garantir que qualquer erro durante a busca do jogo seja tratado de forma adequada, sem que o programa falhe inesperadamente.

Aqui está um exemplo de como você pode estruturar o código para lidar com essas exceções:

val resultado = runCatching {
    val informacaoJogo = buscaApi.buscaJogo(busca)
    meuJogo = Jogo(informacaoJogo.info.title, informacaoJogo.info.thumb)
}

resultado.onFailure {
    println("Jogo não encontrado. Tente outro id.")
}

resultado.onSuccess {
    println("Deseja inserir descrição personalizada? S/N")
    val opcao = leitura.nextLine()
    if (opcao.equals("s", true)) {
        println("Insira a descrição personalizada para o jogo:")
        val descricaoPersonalizada = leitura.nextLine()
        meuJogo?.descricao = descricaoPersonalizada
    } else {
        meuJogo?.descricao = meuJogo?.titulo
    }
    println(meuJogo)
}

Ao encapsular a chamada buscaApi.buscaJogo(busca) dentro do runCatching, você está garantindo que qualquer exceção lançada durante o consumo da API seja capturada e tratada de maneira apropriada, exibindo uma mensagem de erro amigável ao usuário.

Espero ter ajudado e bons estudos!