Подтвердить что ты не робот

Попробуй поймать. Обработка нескольких исключений одинаково (или с провалом)

Здесь уже был поставлен вопрос , который очень похож. Мина расширяет этот вопрос немного больше. Предположим, вы хотите поймать несколько типов исключений, но хотите обрабатывать их одинаково, есть ли способ сделать что-то вроде случая с коммутатором?

switch (case)
{
  case 1:
  case 2:

  DoSomething();
  break;
  case 3:
  DoSomethingElse()
  break;

}

Можно ли обрабатывать несколько исключений одинаково. Что-то вроде

try
{
}
catch (CustomException ce)
catch (AnotherCustomException ce)
{
  //basically do the same thing for these 2 kinds of exception
  LogException();
}
catch (SomeOtherException ex)
{
 //Do Something else
}
4b9b3361

Ответ 1

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

В качестве альтернативы вы можете сделать так, как объяснено в этом вопросе:

Захват нескольких Исключений сразу?

Лично я предпочитаю метод, основанный на методе.

Ответ 2

У вас действительно должно быть BaseCustomException и поймать это.

Ответ 3

Это скопировано из другой публикации, но я тяну код в этот поток:

Поймать System.Exception и включить типы

catch (Exception ex)            
{                
    if (ex is FormatException || ex is OverflowException)
    {
        WebId = Guid.Empty;
        return;
    }

    throw;
}

Я предпочитаю, чтобы это повторяло вызов метода в нескольких блоках catch.

Ответ 4

В vb.net можно использовать фильтры исключений, например,

  Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException

К сожалению, по каким-то причинам разработчики С# еще отказались разрешить писать код фильтрации исключений в С#.

Ответ 5

Вы не должны улавливать это множество пользовательских исключений, однако, если хотите, вы можете создать общий BaseException и поймать это.

Ответ 6

Я никогда не делал этого или что-то вроде этого, и у меня нет доступа к компилятору для тестирования, но наверняка что-то вроде этого будет работать. Не знаете, как на самом деле выполнить сравнение типов, или если С# разрешит вам заменять операторы if оператором case.

try 
{ 
}
catch (System.Object obj)
{
  Type type;

  type = obj.GetType() ;
  if (type == CustomException || type == AnotherCustomException)
  { 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
  } 
  else if  (type == SomeOtherException ex) 
  { 
    //Do Something else 
  }
  else
  {
    // Wasn't an exception to handle here
    throw obj;
  }
}