|
12.09.2011, 11:16 | #1 |
MCTS
|
Как перехватывать ошибки доступа
Зравствуйте. Как перехватывать ошибки доступа, если класс AsciiIo не выбрасывает исключения типа Exception::CLRError. То есть вот так не получится, вроде:
X++: try { new FileIOPermission(fileName, this.fileMode()).assert(); ret = new AsciiIo(fileName, this.fileMode()); ret.outFieldDelimiter(_fieldDelimiter); ret.inFieldDelimiter(_fieldDelimiter); CodeAccessPermission::revertAssert(); } catch (Exception::CLRError) { throw error(AifUtil::getClrErrorMessage()); } |
|
12.09.2011, 11:43 | #2 |
Участник
|
Это внутренний класс Аксапты. К CLR он не имеет оношение. Обрабатывать надо Exception::Error
Но вообще, при невозможности открыть файл (из-за его отсутствия при чтении или при недостатке прав) не создается сам экземпляр класса AsciiIo, т.е. надо обрабатывать так X++: ret = new AsciiIo(fileName, this.fileMode()); if (!ret) throw Error('Нет доступа или файла');
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Eldar9x (5), Kabardian (3). |
12.09.2011, 11:51 | #3 |
MCTS
|
Спасибо
|
|
12.09.2011, 15:06 | #4 |
Участник
|
а если использовать
X++: while "условие" { try { ttsbegin; ... ttscommit; } catch (Exception::Error) { ... } } Последний раз редактировалось niksen; 12.09.2011 в 15:09. |
|
12.09.2011, 15:17 | #5 |
Участник
|
А у вас "снаружи" цикла нет вызовов ttsbegin/ttscommit?
__________________
Axapta v.3.0 sp5 kr2 |
|
12.09.2011, 15:28 | #6 |
Участник
|
нет
X++: while (io.status() == IO_Status::Ok) { c = io.read(); if (io.status() != IO_Status::Ok) { break; } try { ttsbegin; { ++updated; select forupdate BOM; { axBOM = axBOM::construct(); axBOM.boM(BOM); this.FillFields(); axBOM.validateInput(true); axBOM.save(); BOM = axBOM.BOM(); } info('обновлена/создана запись ' + BOMId); info('для ' + itemId); } ttscommit; } catch (Exception::Error) { info('найдена ошибка'); } } |
|
12.09.2011, 15:44 | #7 |
Участник
|
А что такое "ошибочная запись"?
Как эта ошибка проявляется? Кстати, X++: c = io.read(); if (io.status() != IO_Status::Ok) { break; } Не правильнее было бы так? X++: c = io.read(); if ( == connull()) { continue; }
__________________
Axapta v.3.0 sp5 kr2 |
|
12.09.2011, 16:16 | #8 |
Участник
|
попробовал
X++: c = io.read(); if ( == connull()) { continue; } Под ошибочной записью понимается например запись, когда случайно записываем данные к несуществующей записи. В данном случае так и получается, люди, которые должны были подготовить данные, подготовили их не очень хорошо, где-то записи есть, где-то их нет, если использовать всё без классов, то надо вручную писать все проверки, то есть переписывать функционал класса, а так гораздо проще, но непонятно, где же что-то затерялось При этом разницы нет, если я вынесу try-catch из цикла, записи в любом случае не добавляются и не обновляются, если возникла хотя бы одна ошибка |
|
12.09.2011, 17:08 | #9 |
Участник
|
сам нашёл решение данной проблемы, причём даже стыдно
я забыл про X++: select forupdate BOM where (BOM.BOMId == BomId); |
|