C ++ / CLI хорошая практика кодирования, индексированные свойства if-check или try..catch? - PullRequest
0 голосов
/ 09 февраля 2011

Довольно короткий и простой вопрос.

Давайте использовать этот фрагмент кода:

public ref class Foo
{
private:
    System::Collections::Generic::Dictionary<System::String ^,System::String ^> ^ aDictionary;

public:

    property System::String ^ SomeIndexedProperty[System::String ^]
    {
    public: System::String ^ get(System::String ^ index)
            {
                return aDictionary[index];
            }
    }

public:
    Foo(void)
    {
        aDictionary = gcnew System::Collections::Generic::Dictionary<System::String ^,System::String ^>();
    }
};

Было бы лучше окружить / предварительно проверить возвращение оператором if (if( aDictionary->ContainsKey(index) ) или было бы лучше окружить оператор return блоком try..catch?

В обоих случаях возвращать nullptr в случае неудачи.

Скорость на самом деле не имеет значения.Достаточно просто общего «это лучше по этой причине».

Ответы [ 2 ]

2 голосов
/ 09 февраля 2011

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

В соответствующей заметке для свойства может иметь смысл бросить1005 * вместо o возвращая null.Вызывающие могут взять это null и попытаться разыменовать его, что смещает фокус и усложняет поиск ошибки.

1 голос
/ 09 февраля 2011

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

Все аргументы противисключения вместо блоков "if" относятся только к производительности (скорость, память, стек, ecc ...) и являются академическими.В действительности, когда вам нужен метод, полностью исключающий исключения, и вам не нужны причины нулевых возвращаемых значений, просто поместите 5 строк в блок try..catch и забудьте об этом!;)

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