Вернуть в улов блок? - PullRequest
       18

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

54 голосов
/ 22 апреля 2010

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

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

}

Ответы [ 10 ]

36 голосов
/ 22 апреля 2010

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

19 голосов
/ 22 апреля 2010

Одной из альтернатив будет сохранение возвращаемого значения во временной переменной:

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

    return success;
}

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

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

return true;

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

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

11 голосов
/ 22 апреля 2010

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

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

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

9 голосов
/ 22 апреля 2010

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

    try
    {
        return;
    }
    catch(Exception ex)
    {
        return;
    }
    finally
    {
        //some code
    }
7 голосов
/ 22 апреля 2010
public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
    }
    return false;
}

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

2 голосов
/ 22 апреля 2010

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

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

2 голосов
/ 22 апреля 2010

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

0 голосов
/ 12 декабря 2017

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

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

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

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

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

0 голосов
/ 22 апреля 2010

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

0 голосов
/ 22 апреля 2010

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

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