Отладка. Утверждайте по сравнению с броском исключения

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

Также новое и больше сценария определенное руководство было просто опубликовано также в http://www.codeplex.com/TFSBranchingGuideII

90
задан Backwards_Dave 1 May 2018 в 04:49
поделиться

5 ответов

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

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

  • ВСЕГДА должна быть возможность создать тестовый пример, который выполняет данный оператор throw. Если невозможно создать такой тестовый пример, тогда у вас есть путь кода в вашей программе, который никогда не выполняется, и его следует удалить как мертвый код.

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает утверждение стрелять. Если утверждение срабатывает, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

ключевое отличие заключается в следующем:

  • ВСЕГДА должна быть возможность создать тестовый пример, который выполняет данный оператор throw. Если невозможно создать такой тестовый пример, тогда у вас есть путь кода в вашей программе, который никогда не выполняется, и его следует удалить как мертвый код.

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает утверждение стрелять. Если срабатывает утверждение, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

ключевое отличие заключается в следующем:

  • ВСЕГДА должна быть возможность создать тестовый пример, который выполняет данный оператор throw. Если невозможно создать такой тестовый пример, тогда у вас есть путь кода в вашей программе, который никогда не выполняется, и его следует удалить как мертвый код.

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает утверждение. стрелять. Если срабатывает утверждение, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

Если невозможно создать такой тестовый пример, тогда у вас есть путь кода в вашей программе, который никогда не выполняется, и его следует удалить как мертвый код.

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает утверждение. стрелять. Если срабатывает утверждение, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

    Если невозможно создать такой тестовый пример, тогда у вас есть путь кода в вашей программе, который никогда не выполняется, и его следует удалить как мертвый код.

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает утверждение стрелять. Если срабатывает утверждение, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает срабатывание утверждения. Если утверждение срабатывает, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

  • НИКОГДА не должно быть возможности создать тестовый пример, который вызывает срабатывание утверждения. Если срабатывает утверждение, либо код неверен, либо утверждение неверно; в любом случае, что-то нужно изменить в коде.

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

    Я не люблю непроверяемые пути кода.

    Я не люблю непроверяемые пути кода.

    169
    ответ дан 24 November 2019 в 07:00
    поделиться

    Утверждения используются для проверки понимания мира программистом. Утверждение должно терпеть неудачу, только если программист сделал что-то не так. Например, никогда не используйте утверждение для проверки пользовательского ввода.

    Утверждает тест на условия, которые «не могут произойти». Исключения составляют условия, которые «не должно происходить, но происходят».

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

    Если вы используете исключения вместо утверждений, вы теряете некоторую ценность:

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

    2. Ваш тестовый код и код выброса всегда будут выполняться, в то время как утверждения могут быть скомпилированы.

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

    Подробнее здесь: http://nedbatchelder.com/text/assert. html

    15
    ответ дан 24 November 2019 в 07:00
    поделиться

    РЕДАКТИРОВАТЬ: В ответ на изменение / примечание, которое вы сделали в своем сообщении: Похоже, что использование исключений - это правильный выбор, а не утверждения для того типа вещей, которые вы пытаетесь выполнить. Я думаю, что ваш умственный камень преткновения состоит в том, что вы рассматриваете исключения и утверждения для достижения той же цели, и поэтому вы пытаетесь выяснить, какое из них было бы «правильным» для использования. Хотя могут быть некоторые совпадения в том, как могут использоваться утверждения и исключения, не путайте, что для них это разные решения одной и той же проблемы - это не так. У утверждений и исключений есть свои собственные цели, сильные и слабые стороны.

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

    C # Station: Утверждения

    ] Использование операторов assert может быть эффективный способ уловить логику программы ошибки во время выполнения, и тем не менее они легко отфильтровывается из производства код. После завершения разработки стоимость выполнения этих избыточных тесты на ошибки кодирования могут быть устраняется просто путем определения символ препроцессора NDEBUG [который отключает все утверждения] во время компиляция. Однако не забудьте помните, что код помещен в сам assert будет опущен в производственная версия.

    Утверждение лучше всего использовать для проверки состояние только тогда, когда все следующее удержание:

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

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

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

    11
    ответ дан 24 November 2019 в 07:00
    поделиться

    Другой слепок из Code Complete :

    «Утверждение - это функция или макрос который громко жалуется, если предположение неправда. Используйте утверждения для документирования предположения, сделанные в коде, и очистить из неожиданных условий. ...

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

    Далее он добавляет некоторые рекомендации о том, что следует и не следует утверждать.

    С другой стороны, исключения:

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

    Если у вас нет этой книги, вам следует ее купить.

    4
    ответ дан 24 November 2019 в 07:00
    поделиться

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

    0
    ответ дан 24 November 2019 в 07:00
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: