Как перехватить исключение, только если другое исключение не возникло в C#

#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 состоит в том, чтобы остановить исключение от предотвращения выполнения остальной части вашего кода. В вашем случае есть несколько вариантов, которые я вижу с головы до ног:

  1. Решите, действительно ли try-catch — это то, что вы ищете — вы также можете заставить свой метод генерировать исключение и предотвращать выполнение остальной части кода
  2. Создайте исключение в вашем catch, таким образом, вы получите свои журналы, и это сообщит остальной части кода, что что-то пошло не так, препятствуя выполнению
  3. Используйте переменную, которая изменяется при первом перехвате, затем условно выполните остальную часть кода на основе этой переменной
  4. Используйте 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();
  }
  

}
}