Как поймать внутреннее исключение?

Есть ли возможность поймать внутреннее исключение:

try 
{
    ttsbegin;    
    info("step one");        
    try 
    {
       info("step two");
       throw Error("error");
    }
    catch 
    {
       info("catch step two");
    }        
    ttscommit;
}
catch 
{
    info("catch step one");
    ttsabort;
}

Я знаю, что могу получить его, комментируя ttsbegin; / ttscommit, но мне нужна транзакция.


person demas    schedule 21.09.2012    source источник
comment
stackoverflow .com / questions / 183499 / это может пролить свет ...   -  person Frank Tudor    schedule 21.09.2012
comment
msdn.microsoft.com/en-us/library/aa893385.aspx «Образец 5» в разделе «Обработка исключений». Извини за это.   -  person Frank Tudor    schedule 21.09.2012
comment
В примере 5 транзакция используется во внутреннем блоке try..catch. Это не мой случай. Более того, если я добавлю в свой пример внутреннюю транзакцию (но оставлю внешнюю) - ничего не изменится: я получу сообщение о первом шаге.   -  person demas    schedule 21.09.2012


Ответы (1)


Нет, это невозможно (если ваше исключение не UpdateConflict или DuplicateKeyException).

В документации говорится:

Если внутри транзакции возникает исключение, транзакция автоматически прерывается (выполняется операция ttsAbort). Это применимо как к исключениям, созданным вручную, так и к исключениям, созданным системой.

Когда внутри блока транзакции ttsBegin - ttsCommit возникает исключение, никакой оператор catch внутри этого блока транзакции не может обработать исключение. Вместо этого самые внутренние операторы catch, которые находятся за пределами блока транзакции, являются первыми операторами catch, которые нужно протестировать.

Логика такова: 1) ваша транзакция прерывается выбросом 2) тогда вы не можете восстановить это внутри своей транзакции 3) следовательно, возьмите самый внутренний улов за пределами транзакции.

Двумя исключениями (каламбур) являются UpdateConflict и DuplicateKeyException, которые не создают ttsabort и, следовательно, могут быть пойманы внутри транзакции.

Также см. эту запись в блоге, в которой это демонстрируется.

Обновление: потенциальная ловушка

Использование catch all (тип исключения не указан) может вызвать проблемы. См. это сообщение в блоге.
Начиная с обновления 5 D365O, два исключения не перехватываются уловкой всех, если уровень tts больше единицы. См. это сообщение в блоге.

person Jan B. Kjeldsen    schedule 23.09.2012