2013-10-24 5 views
3

Я разрабатываю службу Android и сталкиваюсь с двумя разными стилями для написания кода для проверки валидации.Использование Try Catch Обработка исключений или явные проверки

Первый стиль: Использование булевых или явных проверок. В этом методе я возвращаю все значения, которые я получаю от функций. Возвращаемые значения могут быть нулевыми, закрытыми (недействительными).

boolean fbConnected = appPrefences.isFBConnected(); 
if (!fbConnected) 
{ 
    ShowNotification("FB not connected"); 
    stopSelf(); 
    return; 
} 

Session session = GetSession(); 
if (session.isClosed()) 
{ 
    ShowNotification("Session not valid"); 
    stopSelf(); 
    return; 
} 

Coordinates result = getLocation(); 
if(result == null) 
{ 
    ShowNotification("Could not get location"); 
    stopSelf(); 
    return; 
} 

// Do something finally with Session, FB and location 

Второй Стиль: Использование обработки исключений. Здесь я бросаю собственное собственное исключение из методов утилиты, если сеанс закрыт (недействителен) или если оно равно нулю. И справиться с этим следующим образом:

try 
{ 
    appPrefences.connectToFb(); 
    Session session = GetSession(); 
    Coordinates result = getLocation(); 
} 
catch(FBException e) 
{ 
    ShowNotification("FB not connected"); 
    stopSelf(); 
    return; 
} 
catch(SessionException e) 
{ 
    ShowNotification("Session not valid"); 
    stopSelf(); 
    return; 
} 
catch(LocationException e) 
{ 
    ShowNotification("Could not get location"); 
    stopSelf(); 
    return; 

} 

// Do something finally with Session, FB and location 

На мой взгляд, первый из них лучше, по следующей причине:

  • Во втором методе, бросание исключения берет хиты производительности.

Можно ли использовать первый метод или есть некоторые реальные преимущества для использования второго метода?

ответ

1

Кажется мне первый метод хорошо, так как вы ничего не делаете действительно Exception-накрест за исключением ловли его

3

Использование примерочного/улов блоков в нормальном потоке программы снижает производительность. Лучше использовать операторы if/then в первом примере.

https://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why

Это упоминается в Effective Java. Исключения, как следует из их названия, должны использоваться только для исключительных условий; они никогда не должны использоваться для обычного потока управления.

+0

@ Eric Leschinski - спасибо за рафинирование. –

1

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

4

Используйте исключения

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

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

Я думаю, что функция, как isFBConnected следует проверить, подключен ли facebook. Есть два совершенно правильных ответа: Да, Нет. Исключение должно быть выбрано, если функция не может определить, подключена ли facebook.

2

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

Например, если у вас есть специальный Layout на Android, для которого требуется exaclty для детского просмотра, вы можете сделать исключение: «Требуется ровно два ребенка», чтобы пользователь не застрял в критической катастрофе и не знал, что делать.

+0

Это имеет смысл. Это хороший пример –

Смежные вопросы