попробуй поймать. Обработка нескольких исключений таким же образом (или с провалом) - PullRequest
22 голосов
/ 18 февраля 2010

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

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
}

Ответы [ 6 ]

15 голосов
/ 18 февраля 2010

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

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

Поймать несколько исключений одновременно?

Лично я предпочитаю методический подход.

7 голосов
/ 18 февраля 2010

Вы действительно должны иметь BaseCustomException и ловить это.

4 голосов
/ 12 июля 2013

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

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

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

    throw;
}

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

1 голос
/ 17 октября 2011

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

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

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

0 голосов
/ 18 февраля 2010

На самом деле я никогда не делал этого или чего-то подобного, и у меня нет доступа к компилятору для целей тестирования, но наверняка что-то подобное будет работать. Не уверен, как на самом деле выполнить сравнение типов или если C # позволит вам заменить операторы 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;
  }
}
0 голосов
/ 18 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...