08.10.2020, 22:58 | #1 |
Участник
|
Try Catch в методе update на таблице
Добрый вечер. Если в коде Update таблицы возникло исключение, но оно в блоке try после super(), то изменится ли запись и выполнится код из catch?
|
|
08.10.2020, 23:18 | #2 |
Участник
|
Блок try catch бесполезен если он расположен внутри транзакции. Исключение не будет перехвачено таким блоком. Исключение всегда откатит все уровни транзакций до самого верхнего и будет поймано только тем блоком try catch который находится вне транзакции.
|
|
08.10.2020, 23:39 | #3 |
Участник
|
Но хотя бы в catch попадет вообще, даже если в итоге откатит?
|
|
08.10.2020, 23:51 | #4 |
Участник
|
Нет. Пролетит мимо всех catch, если они внутри транзакции. Попадёт в ближащий подходящий catch стоящий снаружи самой верхней транзакции
|
|
|
За это сообщение автора поблагодарили: Sergey Petrov (1), skuull (-6), Aleksey2020 (1). |
09.10.2020, 00:01 | #5 |
Участник
|
А если в update, который внутри транзакции добавить транзакции следующего уровня и прописать там в другую таблицу лог , а потом произойдет ошибка, то запись в лог тоже откатиться? Задача отследить на update, который в свою очередь внутри транзакции, ошибку, не текст, а факт присутствия
|
|
09.10.2020, 06:46 | #6 |
Участник
|
|
|
09.10.2020, 07:51 | #7 |
Участник
|
Спасибо , то что нужно
|
|
09.10.2020, 08:37 | #8 |
Участник
|
Цитата:
X++: static void TryCatchTest(Args _args) { ttsBegin; try { ttsBegin; try { ttsBegin; info(strFmt("ttslevel %1", appl.ttsLevel())); throw Exception::DuplicateKeyException; ttsCommit; } catch { error(strFmt("catch 2 ttslevel %1", appl.ttsLevel())); } ttsCommit; } catch { info(strFmt("catch ttslevel %1", appl.ttsLevel())); } ttsCommit; } Последний раз редактировалось michel1971; 09.10.2020 в 08:41. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2), A_BAS (1). |
09.10.2020, 09:44 | #9 |
Участник
|
Цитата:
Всегда, да не всегда
|
|
09.10.2020, 10:20 | #10 |
Участник
|
Для UpdateConflict так же работает. Поэтому нужно правильно обрабатывать исключение, как в \Classes\Tutorial_RunbaseBatch\run например, плюс добавить в него обработку исключения DuplicateKeyException
|
|