Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Diferença de exception no logcat e exception pega

Bom dia a todos

Eu estava tentado uma abordagem de pegar a exception específica, e utilizei o when

val (message,orders) = try {
            ordersOpenAi.messagesAndOrder(text)
        } catch (e: Exception){
            when(e){
                is TimeoutException, is AuthenticationException ->  Pair("Erro de conexão", emptyList<Order>())
                else -> throw e
            }
        }

Para forçar o erro, desliguei a conexão de internet no emulador. E com isso, no logcat aparecia a Exceção de TimeoutException:

InputConnectionWrapper.waitForInputConnectionFutureInternal():1486 Failed to get the input connection call's result.
java.util.concurrent.TimeoutException: Waited 100 milliseconds (plus 2 milliseconds, 101100 nanoseconds delay) for ott@861ab61[status=PENDING, info=[task=[running=[NOT STARTED YET], jek@1d3b686]]]
at oqk.get(PG:50)

Mas esse when não estava funcionando e gerava a exceção, então eu fiz o log.e no catch:

Log.e("AssistantViewModel", "Exception: $e")

E apresentou esse resultado:

Exception: com.aallam.openai.api.exception.GenericIOException: Unable to resolve host "api.openai.com": No address associated with hostname

Aí apenas quando eu coloquei o GenericIOException é que deu certo:

val (message,orders) = try {
            ordersOpenAi.messagesAndOrder(text)
        } catch (e: Exception){
            Log.e("AssistantViewModel", "Exception: $e")
            when(e){
                is TimeoutException, is AuthenticationException, is GenericIOException ->  Pair("Erro de conexão", emptyList<Order>())
                else -> throw e
            }
        }

A minha dúvida é: porque no logcat apresenta o TimeoutException enquanto o erro lançado é o GenericIOException?

Ps: eu testei outra exceção utilizando uma key inválida, e apareceu no logcat o TimeoutException e erro pego no Log.e foi o AuthenticationException

1 resposta
solução!

Olá, Murilo! Tudo bem?

A diferença entre a exceção que aparece no logcat e a exceção que é lançada no código está relacionada ao tipo de exceção que está sendo capturada no when. No seu caso, você está capturando exceções do tipo TimeoutException, AuthenticationException e GenericIOException.

Quando você desligou a conexão de internet no emulador, o logcat mostrou a exceção TimeoutException, mas no when essa exceção não foi capturada. Isso ocorre porque a exceção lançada no código é do tipo GenericIOException, que não é tratada no when. Por isso, a exceção é lançada novamente no else e não é tratada corretamente.

Para corrigir isso, você adicionou o GenericIOException no when, o que permitiu que a exceção fosse tratada corretamente.

É importante lembrar que o when é usado para fazer o tratamento de exceções específicas. Se você deseja capturar qualquer tipo de exceção, você pode usar o catch (e: Exception) para capturar todas as exceções do tipo Exception.

Um abraço e bons estudos.