вопрос об исключении в c # - PullRequest
0 голосов
/ 07 мая 2011

следующий фрагмент кода:

class xxx
{

  public xxx(){}

  try
  {
    throw new Exception(InvalidoperationException);
  }
  catch(Exception x)
  {
  }
  catch(InvalidoperationException x)
  {
  }
}

Может кто-нибудь сказать, какое исключение возникнет здесь и в чем причина этого.

Ответы [ 7 ]

8 голосов
/ 07 мая 2011

Ух, тут много проблем.С чего начать?

  1. Этот код не скомпилируется.Блок try-catch, который вы определили, находится вне любого метода, что недопустимо.Вам нужно переместить его внутри метода.

  2. Никогда не бросайте метод, который вы намереваетесь поймать позже в методе.Это широко известно как использование исключений для «управления потоком», что категорически не рекомендуется.Это связано с затратами на производительность, а также очень затрудняет мониторинг исключений, которые вызываются при использовании отладчика, когда у вас есть код, который выбрасывает и перехватывает свои собственные исключения.При необходимости используйте логические переменные (известные как флаги) для управления потоком.

  3. Всегда сначала перехватывает самый * производный класс исключений 1017 *.Это означает, что сначала вы должны поймать InvalidOperationException, до , пытаясь поймать Exception.Вам нужно изменить порядок ваших catch блоков в имеющемся коде.

  4. Вы должны практически никогда поймать System.Exception.Единственными исключениями, которые вы должны поймать, являются те, которые вы явно понимаете и собираетесь обработать.Практически невозможно узнать, что пошло не так или как с этим справиться, когда единственная информация, которая у вас есть, - это генеральное исключение.

    В том же духе вам также следует Никогда не выбрасывайте это исключение из вашего собственного кода.Выберите более описательный класс исключений, который наследует от базового System.Exception класса, или создайте свой собственный, наследуя от того же самого.


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

class Xxx
{
    public Xxx()
    {

    }
}

Не особенно полезно.

2 голосов
/ 07 мая 2011

Если код такой

 class xxx
    {

      public xxx(){

      try
      {
        throw new Exception(InvalidoperationException);
      }

      catch(InvalidoperationException x)
      {
      }

поймать (исключение х) { } } }

Это должно скомпилировать и поднять ваше исключение и поймать. В противном случае ваш код не будет компилироваться вообще.

1 голос
/ 07 мая 2011

Неа. Это не скомпилируется. Таким образом, нет никаких сомнений относительно того, какое исключение будет сгенерировано.

Ваш код должен выглядеть примерно так:

class xxx
{
    public void Test()
    {
        try
        {
          throw new InvalidoperationException(); 
        }
        catch(InvalidoperationException exception)
        {
            // Something about InvalidOperationException;
        }            
        catch(Exception exception)
        {
            // Something about the Exception
        }
    } 
}

Обратите внимание:

  1. Сначала напишите более конкретный класс Exception, поэтому мы пишем InvalidOperationException до класса Exception
1 голос
/ 07 мая 2011

Вы должны написать:

class xxx
{
    public void Test()
    {
        try
        {
          throw new InvalidoperationException(); 
        }
        catch(InvalidoperationException exception)
        {
            // Do smth with exception;
        }            
        catch(Exception exception)
        {
            throw; // Rethrows your exception;
        }
    } 
}

InvalidOperationException наследуется от Exception. catch пытается обработать наиболее конкретную ветку, поэтому здесь будет выполняться catch (InvalidOperationException x).

1 голос
/ 07 мая 2011

Никаких исключений не будет выдано, так как этот код даже не скомпилируется.

Независимо - несколько моментов:

  • При использовании обработки исключений ставьте более конкретное исключение перед менее конкретнымте (так что улов InvalidOperationException должен быть раньше, чем у Exception).
  • Поймать Exception обычно не очень полезно.
  • Если вы ловите исключение, сделайте что-нибудьс ним.

Вы, вероятно, имели в виду:

throw new InvalidOperationException();

Однако, как вы структурировали свои исключения, блок catch(Exception x) работал бы.

0 голосов
/ 07 мая 2011

Ну, код не скомпилируется, но я просто проигнорирую это ...

Если я просто посмотрю на строку:

throw new Exception(InvalidoperationException);

Во-первых, согласно MSDN, такого конструктора не существует. Поэтому я предполагаю, что вы имели в виду конструктор: Exception (String msg, Exception innerException). Имея в виду: бросить новое исключение («блабла», InvalidoperationException);

Исключение, которое выдается, имеет тип Исключение , а не InvalidOperationException . Так что ONLY catch (Exception x) может его поймать.

Если бы вы выбросили InvalidoperationException , чем то, как вы написали порядок уловов, класс Exception будет пойман сначала . Порядок уловов имеет значение.

Лучший совет, который я могу вам дать - просто попробуйте сами и посмотрите, что произойдет.

0 голосов
/ 07 мая 2011

Игнорирование проблемы компиляции .... первый соответствующий блок исключения (catch(Exception x)) получит исключение. Затем вы игнорируете исключение и не перебрасываете его, поэтому исключение увидит внешний мир. Это не делает это хорошей практикой, хотя ... в частности, поймать произвольный Exception и игнорировать его рискованно - это могло быть что угодно ... это не обязательно исключение думал, что это было.

...