попробуйте и поймайте структуру основного вопроса - PullRequest
3 голосов
/ 28 февраля 2011

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

Это просто пример кода, но у меня есть много методов в моих классах Presenter, и мне было интересно, как я поместил улов, просто возвращая false, это нормально, или как еще можно улучшить это

public bool TestMethod()
{
    try
    {
       if(true)
       { 
         //some random code
         return true;
       }
       else{return false;}
    }
    catch{return false;}
}

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

Ответы [ 7 ]

4 голосов
/ 28 февраля 2011

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

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

3 голосов
/ 28 февраля 2011

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

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

Как правило, вы никогда не должны скрывать исключение от пользователя (или некоторые говорят, «никогда не глотайте исключение»), вы должны либо сбросить его, либо обработать исключение и отобразить его пользователю.

По крайней мере, должен быть некоторый журнал исключения.

То же самое с этими точкамив виду, приведенный выше код может быть записан как:

public bool TestMethod()
{
    bool returnValue = false;
    try
    {
       if(true)
       { 
         //some random code
         returnValue = true;
       }       
    }
    catch(Exception ex)
    {
         // log the exception here, or rethrow it
    }

    return returnValue;
}
2 голосов
/ 28 февраля 2011

ИМХО, это не цель блока catch для возврата значений. Я буду использовать это так:


public bool TestMethod()
{
    bool retVal = false;
    try
    {
        if (true)
        {
            //some random code
            retVal = true;
        }
        else{}
    }
    catch{}
    return retVal;
}

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

Дело в том, что удобочитаемость , и у каждого свой стиль (это не вопрос правильного и неправильного).Что я делаю, так это объявляю возвращаемое значение (как некоторые парни делали здесь, например retVal, returnValue, ...), мой фаворит - result, который в вашем случае должен быть bool.

Затем играть с этой result переменной в теле метода, то есть внутри try/catch и НЕ ничего возвращать, если только в конце метода, где я возвращаю result.Лично используйте return там, где не следует запускать оставшийся код (после return).

Таким образом, читатель не будет смущен таким количеством return с.Вы можете подумать о преимуществах производительности на ранних этапах returns, в которых я сомневаюсь (если оптимизация компилятора не может сделать это за вас), она имеет небольшой эффект в мире frameworks и layers, где мы жертвуем производительностью ради проблем проектированияежедневно.

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

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

Это зависит от того, что вы делаете в своем блоке if. Если вы вернете false при неожиданной ошибке, вы никогда не сможете узнать, что пошло не так. Если ваш код достаточно прост и вы знаете, что пошло не так, это хорошее применение.

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

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

Конечно, можно возвращаться прямо из предложения catch, если вы об этом.В противном случае компилятор запретил бы это;например, вы не можете вернуться изнутри предложения finally.

Однако в вашем конкретном примере кода предложение catch кажется бессмысленным, поскольку код внутри try не собираетсягенерировать любые исключения (кроме исключений системного уровня, таких как OutOfMemoryException, но это ... в любом случае исключительное).Было бы более разумно, если бы внутри него был оператор throw или вызов метода, который, по вашему мнению, мог бы вызвать (например, File.Open мог бы выбросить FileNotFoundException).стиль, я бы порекомендовал вам использовать отступ немного больше:

public bool TestMethod()
{
    try
    {
        if (some_condition)
        { 
            //some random code
            return true;
        }
        else
        {
            return false;
        }
    }
    catch
    {
        return false;
    }
}
...