Обработка исключений - PullRequest
       1

Обработка исключений

0 голосов
/ 24 ноября 2010

У меня есть блок кода внутри блока try catch (c #). Блок кода может выдавать два исключения (ArgumentException / NullRefernceException).

try
{
    //Code
}
catch(NullRefernceException Ex)
{
   //Error Handling Code
}
catch(ArgumentException Ex)
{
  //Error Handling code
}

Код обработки ошибок одинаков в обеих Исключениях. Поэтому могу ли я сохранить код обработки ошибок в блоке перехвата ArgumentException, а после NullRefernceException я могу выдать ArgumentException, поскольку у меня есть блок перехвата, следующий за ним. Не уверен, что это сработает, не влияет ли это на производительность и является ли это хорошей практикой программирования.

У меня нет выбора, кроме как иметь одинаковый код в обоих блоках перехвата или использовать отдельный метод, содержащий код обработки ошибок?

Я не хочу хранить код обработки ошибок в отдельном методе и вызывать его.

Ответы [ 6 ]

4 голосов
/ 24 ноября 2010
  1. Если вы выбросите исключение ArgumentException в перехвате NullReferenceException, оно вообще не будет перехвачено блоком ArgumentException.Это будет выброшено на ВЫСОКИЙ улов.

  2. Бросать и ловить Исключения дорого.Вы действительно не должны делать это просто, чтобы не писать один и тот же код дважды.Чтобы не повторять ваш код, просто используйте общий метод обработки / класс

2 голосов
/ 24 ноября 2010

Я всегда стараюсь следовать принципу СУХОЙ, который означает «Не повторяйся сам», то есть не помещайте избыточный код, потому что, когда вам нужно что-то обновить, есть потенциальная вероятность, что вы можете что-то испортить.Поэтому я бы рекомендовал поместить общую логику в отдельный метод и вызывать ее из обоих исключений.

1 голос
/ 24 ноября 2010

Может быть, вы можете

try
{

}
catch(Exception ex)
{
   if (ex is NullRefernceException || ex is ArgumentException)
   {
     //do something
   } 
   else 
   {
      //maybe re-throw the exception
   }
}
1 голос
/ 24 ноября 2010

для решения вашей проблемы вы можете создать один метод вместо записи одного и того же кода в оба блока catch

, например

try
{
    //Code
}
catch(NullRefernceException Ex)
{
   HandleError();
}
catch(ArgumentException Ex)
{
  HandleError();
}
0 голосов
/ 24 ноября 2010

ArgumentException и NullReferenceException оба наследуются от SystemException, так как насчет использования

try
{
   //code
}
catch(SystemException EX)
{
   //handle error
}
0 голосов
/ 24 ноября 2010
try
{
    //Code
}
catch(Exception Ex)
{
   //Error Handling Code for both cases
}

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

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