Olá, Rodrigo! 
No código do AdocaoService, são lançadas três exceções diferentes, cada uma com sua respectiva mensagem:
- "Pet já adotado"
 - "Pet com adoção em andamento"
 - "Tutor com máximo de adoções"
 
No caso do AdocaoController, o método solicitar() está configurado para capturar apenas uma exceção do tipo IllegalStateException, que é a exceção lançada quando o pet já foi adotado ou quando o tutor já atingiu o máximo de adoções permitidas. 
Por isso, quando você tenta adotar um pet que já foi adotado ou um tutor que já atingiu o máximo de adoções, a exceção é capturada e a respectiva mensagem é retornada. 
No entanto, quando você tenta adotar um pet que está com uma adoção em andamento, a exceção lançada é do tipo UnsupportedOperationException. Como o método solicitar() do AdocaoController não está configurado para capturar esse tipo de exceção. A exceção será propagada pela pilha de chamadas até "explodir". E será impresso um rastreamento de pilha (stack trace) no console da aplicação.
Para resolver esse problema, uma das soluções é você poder adicionar um novo bloco catch no método solicitar() do AdocaoController para capturar a exceção UnsupportedOperationException. Veja como ficaria:
@PostMapping
@Transactional
public ResponseEntity<String> solicitar(@RequestBody @Valid SolicitacaoDeAdocaoDTO dados){
    try {
        this.service.solicitar(dados);
    }catch (IllegalStateException ex){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }catch (UnsupportedOperationException ex){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(ex.getMessage());
    }
    return ResponseEntity.ok("Adoção solicitada com sucesso!");
}
Dessa forma, quando uma exceção do tipo UnsupportedOperationException for lançada, ela será capturada e a respectiva mensagem de erro será retornada.
Espero ter ajudado e bons estudos!