2009-12-10 2 views
1

У меня есть скрипт, который отправляет набор записей в файл. Я использую блок Try-Catch для обработки исключений. В блоке catch у меня есть код, где он имеет указатель на следующую запись. Но это не выполняется. В основном я хочу пропустить неудачную запись n перейти к следующей записи.Try Catch block in Siebel

while(currentrecord) 
{ 
try 
{ 
writerecord event 
} 
catch 
{ 
currentrecord = next record 
} 
} 
+4

В каком языке программирования, пожалуйста? Мы не телепаты. –

+2

Некоторый пример кода поможет. а также знание того, на каком языке вы говорите. –

+0

И да, я второй запрос на образец кода. Ваше описание чрезвычайно расплывчато. –

ответ

1

Вы можете использовать примерочные, наконец, структуру, так что все, что внутри блока, наконец, будет выполняться всегда, независимо от того, бросает ли код исключение или нет. Он часто используется для очистки ресурсов, таких как закрытие файлов или соединений. Без предложения catch любое исключенное исключение в вашем блоке try прекратит выполнение, перейдет к вашему окончательному блоку и запустит этот код.

+0

Это не поможет ему, если он повторяет записи внутри блока try-catch. – Dana

4

В большинстве языков (если вы не используете что-то очень странное), Если «writerecord event» не генерирует исключение, блок catch не будет вызываться.

Не вы имеете в виду:

while(currentrecord) { 
    try { writerecord event } 
    catch { log error } 
    finally { currentrecord = next record} 
} 
0

Согласитесь, что «наконец-то» может быть лучшим здесь - но мы знаем, что исключение на самом деле? - Вы можете вывести его в цикле поймать, так что:

A) вы можете доказать, исключение выбрасывают (а не сказать «нулевой» возвращаемой или что-то)

B) Убедитесь, что исключение вы получаете не то, что может помешать работе «nextrecord» ... [не уверен, что «наконец» достигнет в этом случае - по-видимому, исключение должно было бы превратиться в вызов кода?

2

Вы пытаетесь перебрать некоторые записи, возвращаемые запросом? Сделайте что-нибудь вроде этого:

var yourBusObject = TheApplication().GetBusObject("Your Business Object Name"); 
var yourBusComp = yourBusObject.GetBusComp("Your Business Component Name"); 

// activate fields that you need to access or update here 
yourBusComp.ClearToQuery(); 
// set search specs here 
yourBusComp.ExecuteQuery(ForwardOnly); 

if (yourBusComp.FirstRecord()) { 
    do { 
     try { 
      // update the fields here 
      yourBusComp.WriteRecord(); 
     } catch (e) { 
      // undo any changes so we can go to the next record 
      // If you don't do this I believe NextRecord() will implicitly save and trigger the exception again. 
      yourBusComp.UndoRecord(); 

      // maybe log the error here, or just ignore it 
     } 
    } while (yourBusComp.NextRecord()); 
} 
+0

+1 для UndoRecord, который является спецификацией Siebel. –

0

Итак, вы пытаетесь переместиться на следующую запись, если вы не смогли ее совершить. У Роберта Мюллера все было правильно. Чтобы объяснить ...

Если сбой записи WriteRecord, бизнес-компонент по-прежнему будет помещен в грязную запись. Попытка перейти к следующей записи заставит buscomp попытаться записать ее снова - из-за функции, называемой «неявная экономия».

Решение: вам нужно отменить запись (UndoRecord), чтобы отказаться от изменений в поле отказа, прежде чем перейти к следующему.