Обновление статуса таблицы из блока catch фонового потока - PullRequest
1 голос
/ 19 марта 2012

Я вызываю метод, который включает в себя множество выборок и обновлений таблиц, что может занять более 10 минут.Это делается с помощью фонового потока, чтобы пользовательский интерфейс реагировал и пользователю не приходилось ждать его завершения.

Есть вероятность, что может возникнуть исключение.В этом случае мне нужно обновить статус столбца с «Ожидание» до «Сбой».

Можно ли это сделать в блоке перехвата?Могу ли я написать код в блоке catch так, чтобы выполнялся запрос для обновления состояния до сбоя?Это правильный путь или есть другие способы сделать это?

Редактировать : Могу ли я сделать что-то подобное, чтобы при возникновении исключения статус обновлялся до "Failed »и выводится трассировка стека исключений?

catch (Exception e) {
        updateStatusByReqId(reqKey, "F");
        e.printStackTrace();
        }

Будет ли это гарантировать, что в случае каких-либо исключений статус запроса изменится на« Failed »?Обратите внимание, что при создании онлайн-запроса он будет иметь статус «Ожидание».Он должен оставаться в ожидании, если все в порядке, в противном случае изменить на «Failed»

Ответы [ 4 ]

1 голос
/ 19 марта 2012

Если вы напишите код для обновления состояния в блоке catch, он будет работать нормально, однако, поскольку вы находитесь внутри метода, возможно, может быть лучше вернуть логическое значение из методов и обновить пользовательский интерфейс из вызывающего потока, как то так:

private boolean updateDatabase() {
   try { 
    //Your long updating code ...
} catch {
 return false;
}
return true;
}

Затем вы можете вызвать метод из фонового потока и зарегистрировать состояние в пользовательском интерфейсе, если он вернет false:

if(!updateDatabase()) {
//Update UI status 
}

Делать таким образом это лучший стиль, с моей точки зрения ...

1 голос
/ 19 марта 2012

Я бы не поместил код в блок catch.Поместите логику для обновления статуса (в графическом интерфейсе?) В отдельный класс и метод и вызовите его:

String currentColumn = "";
try {
  // ...
} catch (SomeExceptions se) {
  updateColumnStatus(currentColumn, se);  // local method / KISS
  continue;  // we're in a loop, right?
}
0 голосов
/ 19 марта 2012

Похоже, что исключением является некоторый "нормальный" поток шины (например, проверка)Итак, короткий ответ: вы можете выполнить некоторую обработку в блоке catch.

Внимание: хотя вы можете написать практически любую вещь в блоке catch, предпочитайте делать обработку ошибок или восстановление ошибок в блоках catch.

Что происходит, исключение было связано с доступом к базе данных?Вы не сможете обновить столбец до «не удалось».В любом случае вам необходимо пройти дополнительную обработку.Почему бы не использовать то же самое во всех случаях?

0 голосов
/ 19 марта 2012

Можно написать код ошибки в блоке catch!

...