AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.07.2003, 19:13   #1  
ahtoh
Гость
 
n/a
? TTS и try..catch
почему try..catch не работает внутри ttsbegin..ttscommit ?
Старый 09.07.2003, 19:48   #2  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Потому. Стоит принять как данность. Хотя эффект чертовски неприятный.
Старый 09.07.2003, 21:11   #3  
ahtoh
Гость
 
n/a
а как в 3-й Аксапте с этим?
Старый 09.07.2003, 21:38   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
а как в 3-й Аксапте с этим?
Точно так же.
Старый 14.02.2009, 01:28   #5  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Цитата:
Сообщение от EVGL Посмотреть сообщение
Потому. Стоит принять как данность.
Небольшой уточняющий комментарий, чтобы удостовериться
правильно ли я понимаю данную ситуацию (если где не прав - прошу поправить/дополнить):

1. В DAX 4.0 перехват ошибки в try/catch подразумевает неявный вызов ttsabort (кроме перехвата исключения Exception::UpdateConflict).

2. В DAX 4.0 "откат" любой вложенной транзакции всегда означает откат всей цепочки транзакций.

3. Учитывая вышесказанное имеем текущую реализацию: при возникновении исключения оно эскалируется "не перехваченным" вплоть до обработчика исключений самой внешней транзакции. При этом все транзакции, включая вложенные, откатываются.

X++:
static void Test_TTS_1(Args _args)
{
    ;

    try
    {
        ttsbegin; //tts level 1

	//Action block level 1
	//..
         
        try
        {
            ttsbegin; //tts level 2

            try
            {
                throw error("my exception");
            }
            catch //implicit ttsabort
            {
                error("level 3 catched");
            }
            
            ttscommit;
            
            info("level 3 completed");
        }
        catch //implicit ttsabort
        {
            error("level 2 catched");
        }
        
	//Action block level 2
	//..        

	ttscommit;
        
        info("level 2 completed");
    }
    catch //implicit ttsabort
    {
        error("level 1 catched");
    }

    info("level 1 completed");

}

Error Сообщение (01:26:29) my exception
Error Сообщение (01:26:29) level 1 catched
Info Сообщение (01:26:29) level 1 completed
За это сообщение автора поблагодарили: Товарищ ♂uatr (1).
Старый 14.02.2009, 03:16   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Правильно. То есть exception будет обработан первым блоком catch после последнего (внешнего) ttscommit;
Исключением, как вы уже сказали, является UpdateConflict
За это сообщение автора поблагодарили: alex55 (1), Товарищ ♂uatr (1).
Старый 14.02.2009, 14:19   #7  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Не совсем понятна только фраза:
Цитата:
перехват ошибки в try/catch подразумевает неявный вызов ttsabort
...........
catch //implicit ttsabort
На самом деле откат выполняется не при перехвате, а при генерации самого исключения... А перехвата ошибок при этом может и не быть..
Хотя вероятно, вы именно это и имели ввиду..

А так вообще всё верно.
Дополню цитатами из Inside Microsoft Dynamics AX 4.0:
Цитата:
Исключение (кроме конфликта обновления), генерируемое внутри транзакции, останавливает исполнение этого блока, после чего происходит откат всех вставок и обновлений, выполненных после первого оператора ttsBegin.
...........
Исполнение кода не может продолжаться внутри области действия транзакции, поэтому среда времени выполнения игнорирует операторы try и catch внутри транзакции. Это означает, что исключение, сгенерированное внутри транзакции, может быть перехвачено только за пределами транзакции.
...........
Исключение UpdateConflict - это единственное исключение, которое может быть перехвачено и внутри и снаружи действия транзакции.
__________________
Zhirenkov Vitaly
За это сообщение автора поблагодарили: alex55 (1).
Старый 14.02.2009, 15:52   #8  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Цитата:
Сообщение от ZVV Посмотреть сообщение
На самом деле откат выполняется не при перехвате, а при генерации самого исключения... А перехвата ошибок при этом может и не быть..
Хотя вероятно, вы именно это и имели ввиду..
Согласен. Не точно выразился. Спасибо за уточнение!
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
ChangeCompany Try...Catch Владимир Максимов DAX: Программирование 10 12.01.2009 17:19
staticsax: Real world processing: TTS and exceptions Blog bot DAX Blogs 0 20.08.2007 11:50
catch Александр Костоусов DAX: Программирование 3 07.09.2004 10:16
try...catch при операциях с таблицей ushastik DAX: Программирование 1 09.03.2004 18:26
Глупый вопрос про try .. catch Vadik DAX: База знаний и проекты 6 12.03.2003 18:04

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:19.