Нажатие кнопки Я сохраняю информацию в базе данных 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();
}
}
вы хотите сделать «очистить» код только для выполнения, если не является исключением, или он должен выполнить в любом случае, только после того, как исключение перехватывается и обрабатывается ? – AllenG
Если в блоке try выбрано исключение, выполнение немедленно переходит к соответствующему блоку catch и вызывающему коду, если не найдено соответствующего блока catch. Ни в коем случае код после строки, которая генерирует исключение, выполняется в блоке try. Отлаживайте лучше и проверяйте, что очищает эти строки, это не может быть ничего после executeNonQuery, если исключение выбрано именно в этой строке. –
Итак, вы говорите, что код сразу после выполнения ExecuteNonQuery() выполняется, даже если ExecuteNonQuery() выбрасывает? Это неправильно, поэтому что-то еще должно продолжаться. Вы уверены, что исключение исходит из этой строки? – Ray