Поток программы после исключения генерируется в C # - PullRequest
3 голосов
/ 18 июня 2011

Привет! Я смотрю на какой-то старый код C # и замечаю много такого кода:

void SomeFunction()
{
    if (key.Length != Dimensions)
    {
        throw new KeySizeException();
    }
    else
    {
        SomeOtherFunction();
    }
}

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

void SomeFunction()
{
    if (key.Length != Dimensions)
    {
        throw new KeySizeException();
    }

    SomeOtherFunction();
}

По умолчанию исключение должно выбрасывать поток программы из этого метода, верно? Но мне просто интересно, есть ли способ в DotNet настроить обработку необработанных исключений, чтобы вторая реализация работала иначе, чем первая?

Ответы [ 5 ]

5 голосов
/ 18 июня 2011

Вам не нужен блок 'else'.Это избыточно.Если вы используете инструмент рефакторинга, такой как ' Reshaper ' или ' JustCode ', на такие избыточные элементы кода обычно указывают.

3 голосов
/ 18 июня 2011

throw является явным терминалом в этом кодовом блоке, вызов метода фактически завершится в этой точке.Это означает, что блок else является избыточным и может быть удален.

1 голос
/ 18 июня 2011

В C # оба работают одинаково.Я думаю, что вы думаете, если вы обрабатываете исключение (а не выбрасываете его), как избавиться от выполнения второго оператора?

void SomeFunction() 
{     
   if (key.Length != Dimensions)     
   {  
       throw new KeySizeException(); //Halt the execution of SomeFunction method
   }
      SomeOtherFunction(); 
} 

Если вы обрабатываете и не хотите выполнять SomeOtherFunction, вы можете простовернуться как показано ниже.

void SomeFunction() 
{     
   if (key.Length != Dimensions)     
   {  
       HandleMyException(); 
       return;    // Returns and halt the execution of SomeFunction method.
   }
      SomeOtherFunction(); 
} 
1 голос
/ 18 июня 2011

Два полностью эквивалентны.

0 голосов
/ 18 июня 2011

Как другие говорили, что эти две части кода эквивалентны.

Я подумал, что у меня возникнут дополнительные мысли.

Во-первых, код, как показано, по существу реализует метод-обертку (SomeFunction), который работает как защитное предложение для SomeOtherFunction.Я бы с осторожностью это сделал - когда ваша KeySizeException будет перехвачена, вы не узнаете только из трассировки стека, что SomeOtherFunction была задействована вообще.Это также означает, что вы не можете видеть это требование SomeOtherFunction благодаря простой проверке кода этого метода.

Кроме того, вы можете рассмотреть возможность рефакторинга этих типов кода в .NET 4.0 Code Contracts - они могут значительно облегчитьпрочитайте код.

Заключительная мысль - в таких случаях, как ваш, я иногда испытываю желание оставить все остальное.Это делает на 100% понятным для кого-то еще, что подразумевается поведение if / else.

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