Должен ли я оставить недостижимый перерыв в случае, когда я выбрасываю исключение? - PullRequest
7 голосов
/ 30 марта 2012

Глупо с моей стороны оставлять недоступные операторы break в случае, если в любом случае просто возникает исключение? Защитная часть меня хочет оставить это там в случае, если логика изменится. Другая часть меня не хочет, чтобы другие разработчики видели предупреждения компилятора в моем коде («Обнаружен недоступный код»).

switch (someInt)
{
    case 1:
        // Do something
        break;
    case 2:
        // Do something else
        break;
    case 3:
        // Oh, we don't use threes here!
        throw new Exception("Business rules say don't use 3 anymore");
        break; // Unreachable...until the fickle business rules change...
    default:
        throw new Exception("Some default exception");
        break; // Unreachable...until...well, you get the idea.
}

Что делать?

UPDATE

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

Ответы [ 9 ]

7 голосов
/ 30 марта 2012

Я бы их убрал.Несколько причин:

  • В данный момент они вам не нужны
  • Вид множества предупреждений всегда заставляет меня нервничать, так как вы можете потерять настоящие предупреждения в шуме, исходящем от этого типа предупреждения (при условии, что у вас есть предупреждение как ошибка выключена).
7 голосов
/ 30 марта 2012

Я бы не "спрятал" это в switch.Я бы бросил ArgumentExceptions как можно скорее.Это позволяет избежать побочных эффектов и также более прозрачно.

Кто-то может добавить код перед переключателем в какой-то момент, который использует someInt, хотя он равен 3.

Например:

public void SomeMethod(int someInt)
{
    if (someInt == 3)
        throw new ArgumentException("someInt must not be 3", "someInt");

    switch (someInt)
    {
        // ...
    }
}
2 голосов
/ 30 марта 2012

Лично я бы никогда не оставил недоступный код в рабочем коде.Это хорошо для тестирования, но не оставляйте это как таковое.

Вы бы никогда этого не сделали, не так ли?

public void MyMethodThatThrows()
{
    throw new Exception();
    return;  // unneeded
}

, так зачем сохранять break?

2 голосов
/ 30 марта 2012

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

РЕДАКТИРОВАТЬ: Я удалил свое первоначальное замечание о компиляторе, заставив вас поставить break операторов вернутся, если throw операторы должны были быть удалены.Как отметил Payo, в некоторых случаях компилятор не будет.Было бы просто объединить случай с тем, что под ним.

1 голос
/ 30 марта 2012

Я бы удалил.

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

0 голосов
/ 04 мая 2013

MSDN C # Reference заявляет: «Оператор перехода, такой как разрыв, требуется после каждого блока регистра, включая последний блок, будь то инструкция регистра или инструкция по умолчанию.»

Итак, не «бросить» не является «оператором прыжка»?Я думаю, что это так.Таким образом, «перерыв» не требуется, а «недостижимая» проблема исчезает.:)

0 голосов
/ 30 марта 2012

Хотелось бы, чтобы источники моего проекта были такими крутыми и без проблем, чтобы мне приходилось думать о таких незначительных случаях защитного программирования :)

Я имею в виду, что в программном обеспечении так много подводных камней.разработка - COM и Interop, Безопасность / Разрешения и Аутентификация, Сертификаты, что ... черт возьми, я не могу сказать, сколько кода мне нужно написать, чтобы защитить себя от стрельбы в ногу.

Просто удалите этот разрыв, потому что он избыточен, он сбивает с толку тех, кто знает, что «дело» должно заканчиваться break или return и должен стать очевидным для тех, кто этого не знает.

0 голосов
/ 30 марта 2012

Защитная часть меня хочет оставить это там в случае изменения логики.

Хорошо, если вы удалите throw и забудете добавить breakкомпилятор сообщит вам.

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

0 голосов
/ 30 марта 2012

Защитная часть меня хочет оставить это там на случай, если логика изменится.

Какая логика здесь может быть изменена?То, что происходит, когда выдается исключение, задокументировано довольно хорошо.И я думаю, что вы можете быть достаточно уверены, что никакая более поздняя версия C # не приведет к серьезному изменению величины «все программы, которые до сих пор не работают».

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

...