Подтвердить что ты не робот

Вернуть в блок catch?

Неправильно ли иметь оператор return в блоке catch? Каковы альтернативы?
то есть:

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

}
4b9b3361

Ответ 1

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

Ответ 2

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

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

    return success;
}

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

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

return true;

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

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

Ответ 3

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

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

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

Ответ 4

Это нормально, просто имейте в виду, что какой-то код может быть выполнен после команды возврата (возвращаемое значение будет обналичено).

    try
    {
        return;
    }
    catch(Exception ex)
    {
        return;
    }
    finally
    {
        //some code
    }

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

    int Test(out int t)
    {
        int i = 1;
        t = 1;
        try
        {
            if(DateTime.Now.Second < 58)
                throw new Exception();
        }
        catch (Exception)
        {
            return i;
        }
        finally
        {
            i = 2;
            t = 2;
        }

        return -1;
    }

Ответ: он вернет 1, как если бы мы выполнили только я = 1, но он имел бы t = 2, хотя t = 2 произошло после я = 2.

Как вы видите, нарушено визуальное и техническое правило "без кода после возврата".

Ответ 9

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

Ответ 10

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

Ответ 11

Вы можете добавить return в блок catch. Вы явно знаете, что ваш код вернется и продолжит выполнение вместо остановки в блоке catch.

try{
    //do something
}
catch{
    //error handling
    return;
}

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

try{
    //do something
}
catch (Exception as err){
    if (err == "IOException"){
         //handle exception
    else if (err.indexOf("TypeError"){
         //handle exception
    }
}

Это два способа проверки типа исключения, чтобы вы могли отображать сообщение соответствующим образом. Вы также можете просто перехватить определенные исключения, если хотите, вместо Exception as err вы можете сделать catch IOException, ...