|
25.11.2009, 06:53 | #1 |
HAI; CAN HAS STDIO?
|
Business Connector и обработка исключений
Привет,
аксапта 3.0 sp4, есть внешняя программа, которая обращается к аксапте через Business Connector, создаёт экземпляр аксаптовского класса и вызывает один из его методов. проблема в том, что если возникает какое-либо исключение - при постинге или при создании записей, эти исключения возвращаются напрямую во внешнюю программу, никакие try/catch не работают, даже если я помещаю try/catch в тот самый метод, который вызывает внешняя программа, и даже если делаю 10 catch частей для каждого типа исключений (+1 пустой, для всех). в чём может быть загвоздка? или обработка исключений в классе не работает, если он создан через Business Connector, на что очень похоже, но что совсем не логично. посоветуйте, что сделать, чтобы исключения ловились в аксапте - внешней программе совсем не обязательно знать, что что-то пошло не так, потому что она тут же перестаёт работать сама. внешнюю программу я изменить не могу: компания, которая её разработала, уже не существует, а исходников нет.
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
25.11.2009, 08:10 | #2 |
Участник
|
Не все исключения в AX можно перехватить (сам в свое время был в шоке). Business Connector тут ни при чем. Используйте вместо перехвата исключений проверки. На все и побольше.
|
|
25.11.2009, 11:12 | #3 |
MCITP
|
Глупый вопрос: Я ж надеюсь try/catch не внутри транзакции ставите?
А то иначе было бы интересно взглянуть на примеры...
__________________
Zhirenkov Vitaly |
|
25.11.2009, 15:21 | #4 |
Участник
|
Да, похоже именно на открытую транзакцию. Потому что исключения при вызове из BC нормально перехватываются в АХ, afaik
|
|
25.11.2009, 23:57 | #5 |
HAI; CAN HAS STDIO?
|
в том-то и дело, что транзакции все внутри try/catch. попробую сейчас изобразить листинг.
вот функция, которую вызывает внешняя программа и в которой всё происходит: X++: public Anytype updateTable(tableId _tablenum, TransTypes _type, recId _recId = 0, Container _values = connull()) { anytype _object = new DictTable(_tablenum).makeRecord(); int logPoint; int line; Container c; ; buffer = _object; logPoint = infolog.num(); try { switch (_type) { case (TransTypes::RecSelect) : break; case (TransTypes::RecInsert) : _object = this.RecInsert(_object, _recId, _values); break; case (TransTypes::RecUpdate) : _object = this.RecUpdate(_object, _recid, _values); break; case(TransTypes::RecDelete) : _object = this.RecDelete(_object, _recId, _values); break; } } catch (exception::Break) { abs(1); } catch (exception::DDEerror) { abs(1); } catch (exception::Deadlock) { abs(1); } catch (exception::Error) { abs(1); } catch (exception::Info) { abs(1); } catch (exception::Internal) { abs(1); } catch (exception::Numeric) { abs(1); } catch (exception::Sequence) { abs(1); } catch (exception::Warning) { abs(1); } catch { line = infolog.line(); c = infolog.cut(logPoint + 1, line); MyErrorLog::processError(_tablenum, _type, _recId, _values, c); } return _object; }
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
26.11.2009, 00:58 | #6 |
HAI; CAN HAS STDIO?
|
одним словом, никаких транзакций за пределами этой функции нет, разве что есть способ задать начало и конец транзакции в коде внешней программы, который я не увижу в дебаггере.
схема того, что происходит: внешняя программа -> Business Connector -> MyClass::construct() внешняя программа <- Business Connector <- экземпляр класса MyClass внешняя программа -> Business Connector -> MyClass.updateTable() ..то есть когда я смотрю в дебаггере выполнение на Business Connector сессии, то эта функция самая внешняя, то есть try/catch должен поймать что бы там ни было - тем более, что ошибки, которые возникают, это ошибки постинга, например закрытый период в general ledger. так почему же не ловится?
__________________
our sharp bitter vitriol is not that of the vulgar. |
|
|
|