Возвратиться в блоке выгоды?

Является неправильным, должен иметь оператор возврата в блоке выгоды? Каковы альтернативы?
т.е.:

public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        return false;
    }

}
58
задан Henrik 22 April 2010 в 11:01
поделиться

9 ответов

Основная цель блока catch - предоставить место, где можно продолжить исключительную ситуацию, возникшую в блоке try. Итак, вы поймали исключение, обработали его ... и вернулись из метода. Если вызывающий метод не заботится об исключении, это абсолютно нормально.

0
ответ дан 24 November 2019 в 18:59
поделиться

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

    try
    {
        return;
    }
    catch(Exception ex)
    {
        return;
    }
    finally
    {
        //some code
    }
9
ответ дан 24 November 2019 в 18:59
поделиться

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

2
ответ дан 24 November 2019 в 18:59
поделиться

Один из вариантов - сохранить возвращаемое значение во временной переменной:

public bool SomeFunction()
{
    bool success = true;
    try
    {
        //somecode
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        success = false;
    }

    return success;
}

Но лично я нахожу способ, которым вы его написали (с одним универсальный оператор catch), чтобы он был более читабельным. С другой стороны, если вы ожидаете определенного исключения и у вас может быть несколько способов вернуть успех или нет ...

try
{
    DoTheImportantThing();
    DoTheOtherThingThatMightFailButWeDontCare();
}
catch (DontCareAboutItException ex)
{
    log.Info(ex);
}
catch (Exception ex)
{
    log.Error(ex);
    return false;
}

return true;

Тогда, на мой взгляд, вам лучше продвигать операторы return как можно ближе к концу.

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

20
ответ дан 24 November 2019 в 18:59
поделиться

Для меня имеет смысл функция, которая возвращает истину в случае успеха и ложь в случае неудачи. Надеюсь, в этом нет ничего плохого - я делаю это постоянно :)

0
ответ дан 24 November 2019 в 18:59
поделиться

Если в блоке try уже есть оператор возврата, я бы, вероятно, поместил другой оператор возврата в конец функции:

try
{
    //somecode
    return true;
}
catch(Exception ex)
{
    MessageBox.Show(ex.message);
}
return false;

И это для того, чтобы избегайте многократных возвратов, если необходимо обработать несколько исключений.

11
ответ дан 24 November 2019 в 18:59
поделиться
public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
    }
    return false;
}

Лично я помещаю оператор return в конец метода, а не в блок catch. Но оба хороши. Все дело в удобочитаемости (субъективном) и рекомендациях в вашей организации.

8
ответ дан 24 November 2019 в 18:59
поделиться

Да, это совершенно нормально.

Не забывайте, что вы также можете использовать блок finally, который будет выполняться после return.

2
ответ дан 24 November 2019 в 18:59
поделиться

Вы можете нормально возвращаться из блока catch. Это обычно хороший функциональный код.

39
ответ дан 24 November 2019 в 18:59
поделиться
Другие вопросы по тегам:

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