Код, который выполняется только в том случае, если попытка не перехватывает - PullRequest
0 голосов
/ 28 декабря 2011

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

РЕДАКТИРОВАТЬ: Попытка поместить его в блок 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();
        }
    }

Ответы [ 6 ]

7 голосов
/ 28 декабря 2011

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

try {/*execute code*/}
catch(System.Exception e){/*handle exceptions*/}
finally {/*clean up regardless if an exception was thrown or not*/}
2 голосов
/ 28 декабря 2011

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

bool EverythingIsFine = true;
try{
     //Your code
}
catch(Exception){
    if(Condition){
        EverythingIsFine = false;
        ShowRelatedAlerts();
    }
}
if(!EverythingIsFine){
    //DoMoreStuff
}
1 голос
/ 28 декабря 2011

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

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

1 голос
/ 28 декабря 2011

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

0 голосов
/ 28 декабря 2011

, чтобы обеспечить немного больше контекста для ответа NotMyself

   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();
    }
0 голосов
/ 28 декабря 2011

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

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