From 48ba5d8b3e331d6db17abf56ba79c53807425089 Mon Sep 17 00:00:00 2001 From: Stas Parshin Date: Thu, 27 Jun 2019 14:12:45 +0700 Subject: [PATCH] Catch exceptions in update listener #168 --- .../telegrambot/impl/UpdatesHandler.java | 47 ++++++++++--------- .../telegrambot/UpdatesListenerTest.java | 13 +++++ 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java index 84af9c7c..f31d7ce0 100644 --- a/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java +++ b/library/src/main/java/com/pengrad/telegrambot/impl/UpdatesHandler.java @@ -51,40 +51,34 @@ public void onResponse(GetUpdates request, GetUpdatesResponse response) { if (!response.isOk() || response.updates() == null || response.updates().size() <= 0) { if (!response.isOk()) { - if (exceptionHandler != null) { - String message = "GetUpdates failed with error_code " + - response.errorCode() + " " + response.description(); - exceptionHandler.onException(new TelegramException(message, response)); - } else { - Platform.get().log(Platform.INFO, - "Update listener error for request " + request.toWebhookResponse() + - " with response " + response.errorCode() + " " + response.description(), null); - } + String message = "GetUpdates failed for request " + request.toWebhookResponse() + + " with error_code " + response.errorCode() + " " + response.description(); + handleException(new TelegramException(message, response), message); } sleep(); getUpdates(request); return; } - List updates = response.updates(); - int lastConfirmedUpdate = listener.process(updates); + try { + List updates = response.updates(); + int lastConfirmedUpdate = listener.process(updates); - if (lastConfirmedUpdate != CONFIRMED_UPDATES_NONE) { - int offset = lastConfirmedUpdate == CONFIRMED_UPDATES_ALL - ? lastUpdateId(updates) + 1 - : lastConfirmedUpdate + 1; - request = request.offset(offset); + if (lastConfirmedUpdate != CONFIRMED_UPDATES_NONE) { + int offset = lastConfirmedUpdate == CONFIRMED_UPDATES_ALL + ? lastUpdateId(updates) + 1 + : lastConfirmedUpdate + 1; + request = request.offset(offset); + } + } catch (Exception e) { + handleException(e, "Exception in update listener for request " + request.toWebhookResponse()); } getUpdates(request); } @Override public void onFailure(GetUpdates request, IOException e) { - if (exceptionHandler != null) { - exceptionHandler.onException(new TelegramException(e)); - } else { - Platform.get().log(Platform.INFO, "Update listener failure", e); - } + handleException(e, "GetUpdates failed for request " + request.toWebhookResponse()); sleep(); getUpdates(request); } @@ -102,4 +96,15 @@ private void sleep() { } catch (InterruptedException ignored) { } } + + private void handleException(Exception e, String message) { + if (exceptionHandler != null) { + TelegramException telegramException = (e instanceof TelegramException) + ? (TelegramException) e + : new TelegramException(e); + exceptionHandler.onException(telegramException); + } else { + Platform.get().log(Platform.INFO, message, e); + } + } } diff --git a/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java b/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java index 2fa478d3..4c4e487c 100644 --- a/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java +++ b/library/src/test/java/com/pengrad/telegrambot/UpdatesListenerTest.java @@ -1,6 +1,7 @@ package com.pengrad.telegrambot; import com.pengrad.telegrambot.model.Update; +import com.pengrad.telegrambot.request.GetUpdates; import okhttp3.*; import org.junit.Before; import org.junit.Test; @@ -38,6 +39,18 @@ public static String token() { private TelegramBot bot; + public static void main(String[] args) { + TelegramBot bot = new TelegramBot.Builder(token()).debug().build(); + bot.setUpdatesListener(updates -> { + System.out.println(updates); + updates.get(100).message(); + return UpdatesListener.CONFIRMED_UPDATES_ALL; + }, e -> { + System.out.println(e); + e.printStackTrace(); + }, new GetUpdates()); + } + @Before public void initBot() { bot = new TelegramBot.Builder(token()).debug().build();