#c# #entity-framework #linq
#c# #entity-framework #linq
Вопрос:
Итак, я изучаю программирование, и я хочу, чтобы мой код выполнял try-catch для исключения, но ТОЛЬКО если другое исключение не возникло. Позвольте мне показать, что вы хотите, чтобы я сделал:
using (var ctxInsert = new model())
{
CATEGORIES c1 = new CATEGORIES(6, "cat6", "category6");
Console.WriteLine("Please wait while rows are added to tables...");
//first try-catch to know if the new entry exist
try
{
ctxInsert.CATEGORIES.Add(c1);
}
catch (ModelValidationException e1)
{
Console.WriteLine(e1.Message);
Console.WriteLine("Category already exist");
}
//second try-catch to make sure saving changes to table is succesful
try
{
ctxInsert.SaveChanges();
Console.WriteLine(c1.NAME " : Succesfuly added");
}
catch (DbEntityValidationException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("not done");
}
}
Console.ReadLine();
Итак, что я пытаюсь сделать, так это то, что второй блок try-catch запускается только в том случае, если первый НЕ перехватил исключение. Потому что прямо сейчас, например, выполняются оба try-catch, и нет смысла сохранять изменения, если первый перехватит исключение.
Я перепробовал кучу вещей самостоятельно, но ничего не работает…
Комментарии:
1. добавьте
return
оператор в первый catch.2. Как упоминал @MathewHD, вы можете использовать оператор return в первом блоке catch. В качестве альтернативы, у вас может быть какая-то переменная bool «flag», для которой вы устанавливаете значение false в catch. Затем, когда выполняется вторая попытка / перехват, вы можете использовать оператор if, чтобы заблокировать выполнение.
Ответ №1:
Если вам нужно просто заставить ваш код работать так, как вы ожидали, вы можете написать так:
using (var ctxInsert = new model())
{
CATEGORIES c1 = new CATEGORIES(6, "cat6", "category6");
Console.WriteLine("Please wait while rows are added to tables...");
//first try-catch to know if the new entry exist
try
{
ctxInsert.CATEGORIES.Add(c1);
ctxInsert.SaveChanges();
Console.WriteLine(c1.NAME " : Succesfuly added");
}
catch (ModelValidationException e1)
{
Console.WriteLine(e1.Message);
Console.WriteLine("Category already exist");
}
catch (DbEntityValidationException e)
{
Console.WriteLine(e.Message);
Console.WriteLine("not done");
}
}
Console.ReadLine();
НО я бы предпочел писать код без каких-либо попыток / перехвата, но создавать перехватчики исключений на верхнем уровне вашего приложения (есть лучшие практики, в зависимости от того, какую среду вы используете)
Комментарии:
1. Спасибо!!! Ваш способ работает ОТЛИЧНО !!! … Позже я узнал, что в моем коде была какая-то другая проблема (ModelValidationException), это было не то, что я думал. Поэтому, когда я заменил это на (DbUpdateException), используя ваш метод, он сработал # 1
Ответ №2:
Весь смысл try-catch состоит в том, чтобы остановить исключение от предотвращения выполнения остальной части вашего кода. В вашем случае есть несколько вариантов, которые я вижу с головы до ног:
- Решите, действительно ли try-catch — это то, что вы ищете — вы также можете заставить свой метод генерировать исключение и предотвращать выполнение остальной части кода
- Создайте исключение в вашем catch, таким образом, вы получите свои журналы, и это сообщит остальной части кода, что что-то пошло не так, препятствуя выполнению
- Используйте переменную, которая изменяется при первом перехвате, затем условно выполните остальную часть кода на основе этой переменной
- Используйте try-catch-finally
Комментарии:
1. Нет, это не весь смысл перехвата исключения. Иногда это может позволить вам восстановить состояние, в котором все продолжает работать, ИЛИ предпринять компенсирующие действия, ИЛИ где-то зарегистрировать ошибку, или просто не повезло, когда вам нужно попробовать несколько альтернатив, но единственный доступный API выдает сбой. Возможно, вы не захотите продолжать выполнение в первых двух случаях. Или рассмотрим C , где лексически ограниченное уничтожение автоматически обеспечивает безопасность исключений, если вы будете осторожны, чтобы не выбрасывать из них, делая первые два ненужными.
Ответ №3:
да, вы можете использовать ключевое слово finally, позвольте мне показать вам пример кода
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int resu<
DivNumbers() {
result = 0;
}
public void division(int num1, int num2) {
try {
result = num1 / num2;
} catch (DivideByZeroException e) {
Console.WriteLine("Exception caught: {0}", e);
} finally {
Console.WriteLine("Result: {0}", result);
}
}
static void Main(string[] args) {
DivNumbers d = new DivNumbers();
d.division(25, 0);
Console.ReadKey();
}
}
}