2011-12-28 2 views
0

Нажатие кнопки Я сохраняю информацию в базе данных Sqlite. У меня есть команда.ExecuteNonQuery() в блоке try. У меня все обработано, просто найдите, поймал ли блок catch, но если все проделает все, что нужно, я хочу, чтобы другой код исполнялся, чтобы очистить значения моих EditTexts и установить фокус. Я пытаюсь поместить этот код после ExecuteNonQuery() в блок try, но он все еще выполняется перед блоком catch, даже если исключение поймано, поэтому значения моих edittexts очищаются, прежде чем блок catch может даже что-либо сделать. Такая же история, если я полностью добавлю код после моего блока try/catch. Блок catch, по-видимому, является последней вещью, выполняемой, и к тому времени значения были очищены, и блок catch не может даже выполнить должным образом. Как установить значения для очистки только после удаления блока catch и исключения не выбрасываются?Код, который выполняется только в том случае, если Try Catch

EDIT: Пробовал поместить его в блок finally, но то же самое. Окно Locals показывает как partnumber.Text, так и partQty.text пустые к тому времени, когда они попадают в блок catch. Но если я возьму код, который очистит эти поля, то оба они все еще имеют свои значения в блоке catch. Есть ли что-то особенное, возможно, в отношении исключений Sqlite, которые создавали бы проблему с синхронизацией?

 try 
    { 
     c.ExecuteNonQuery(); 
     partnumber.Text = ""; 
     partqty.Text = ""; 
     partnumber.RequestFocus(); 
    } 
    catch (SqliteException ex) 
    { 
     if (ex.ErrorCode.ToString() == "Constraint") 
     { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.SetTitle("Item Duplication"); 
      builder.SetMessage("You have already counted this item. How would you like to proceed?"); 
      builder.SetPositiveButton("Add to Previous", delegate 
      { 
       var newQty = Convert.ToInt32(test.currQuantity(partnumber.Text)) + Convert.ToInt32(partqty.Text); 
       var n = connection.CreateCommand(); 
       connection.Open(); 
       n.CommandText = "Update [Items] Set Quantity = '" + newQty.ToString() + "' Where ItemNmbr = '" + partnumber.Text + "'"; 
       n.ExecuteNonQuery(); 
       Toast.MakeText(this, "Quantity updated to: " + newQty.ToString(), ToastLength.Long) 
        .Show(); 
       partnumber.Text = ""; 
       partqty.Text = ""; 
       partnumber.RequestFocus(); 
       connection.Close(); 
       return; 
      }); 
      builder.SetNegativeButton("Override Previous", delegate 
      { 
       var n = connection.CreateCommand(); 
       connection.Open(); 
       n.CommandText = "Update [Items] Set Quantity = '" + partqty.Text + "' Where ItemNmbr = '" + partnumber.Text + "'"; 
       n.ExecuteNonQuery(); 
       Toast.MakeText(this, "Quantity updated to: " + test.currQuantity(partnumber.Text), ToastLength.Long) 
        .Show(); 
       partnumber.Text = ""; 
       partqty.Text = ""; 
       partnumber.RequestFocus(); 
       connection.Close(); 
       return; 
      }); 
      var dialog = builder.Create(); 
      dialog.Show(); 
     } 
     else 
     { 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.SetTitle("Error"); 
      builder.SetMessage(ex.Message.ToString()); 
      var dialog = builder.Create(); 
      dialog.Show(); 
     } 
    } 
+0

вы хотите сделать «очистить» код только для выполнения, если не является исключением, или он должен выполнить в любом случае, только после того, как исключение перехватывается и обрабатывается ? – AllenG

+5

Если в блоке try выбрано исключение, выполнение немедленно переходит к соответствующему блоку catch и вызывающему коду, если не найдено соответствующего блока catch. Ни в коем случае код после строки, которая генерирует исключение, выполняется в блоке try. Отлаживайте лучше и проверяйте, что очищает эти строки, это не может быть ничего после executeNonQuery, если исключение выбрано именно в этой строке. –

+3

Итак, вы говорите, что код сразу после выполнения ExecuteNonQuery() выполняется, даже если ExecuteNonQuery() выбрасывает? Это неправильно, поэтому что-то еще должно продолжаться. Вы уверены, что исключение исходит из этой строки? – Ray

ответ

7

Вы можете попробовать положить их в блок finally.

try {/*execute code*/} 
catch(System.Exception e){/*handle exceptions*/} 
finally {/*clean up regardless if an exception was thrown or not*/} 
+2

Возможно, я неправильно понял, что здесь задают, но у меня создалось впечатление, что они хотели, чтобы код выполнялся, если исключение не было выбрано. –

+1

@ M.Babcock название вопроса вводит в заблуждение. Он хочет, чтобы очистка происходила во всех случаях, только до того, как были исключены исключения. – Ray

+0

попытался положить его в блок finally, но то же самое. Окно Locals показывает как partnumber.Text, так и partQty.text пустые к тому времени, когда они попадают в блок catch. Но если я возьму код, который очистит эти поля, то оба они все еще имеют свои значения в блоке catch. Есть ли что-то особенное, возможно, в отношении исключений Sqlite, которые создавали бы проблему с синхронизацией? – jmease

1

Выполнение внутри блока try немедленно прекращается, если возникает исключение. Следовательно, последняя строка блока try выполняется только в том случае, если исключений не возникает.

-1

Использование try-catch-finally:

try 
    { 
     // Try something 
    } 
    catch (System.IO.IOException e) 
    { 
     // Handle exception 
    } 
    finally 
    { 
     // Some cleanup 
    } 
2

Поместите bool перед вашим «попробовать» блок и установите его значение. Если вы показываете предупреждение, установите bool в противоположное значение, а затем действуйте на основе этого.

bool EverythingIsFine = true; 
try{ 
    //Your code 
} 
catch(Exception){ 
    if(Condition){ 
     EverythingIsFine = false; 
     ShowRelatedAlerts(); 
    } 
} 
if(!EverythingIsFine){ 
    //DoMoreStuff 
} 
+1

Это идеальный ответ ... почему голосующий ??? –

+0

Он отвечает на заголовок, но не вопрос. Он также использует шаблон кода, который излишне сложный. – Ray

+0

, наконец, делает это и уже является частью фреймворка, также он хочет, чтобы очистка всегда происходила. – Maess

1

Похоже, у вас есть подобный код в блоке поймать, я уверен, что это то, что выполняется, а не код после Sql заявление, которое бросает ошибку

поставить точку останова после который бросает исключение, и вы увидите, что он не попал.

0

обеспечить немного больше контекста NotMyself's answer

try 
    { 
     c.ExecuteNonQuery(); 
    } 
    catch (SqliteException ex) 
    { 
     // at this point the values in the partNumber textbox haven't been cleared out 
     showAlerts(ex); 
    } 
    finally 
    { 
     // clear the textbox after the code in the try block 
     // and the code in the catch block have executed (IF it executed) 
     partnumber.Text = ""; 
     partqty.Text = ""; 
     partnumber.RequestFocus(); 
    } 
Смежные вопросы