2013-02-16 4 views
4

Есть ли недостаток в том, чтобы положить большую часть вашего кода для вашей функции в try statement. Если я делаю что-то, что требует try statement, я обычно делаю много работы для этой функции внутри оператора try, потому что обычно я объявляю свои переменные и не могу использовать их вне этой области, если я это сделаю. Это распространено и принято? Обычно люди объявляют переменную до того, как не инициализируют их, чтобы они не делали все (включая вызовы других функций) внутри try statement? Или это не имеет значения, если он очень длинный?Заявления о длинных попытках

+2

Не уверен, что вы делаете, но вы можете инициализировать переменную до некоторого значения по умолчанию вне блока try. – nhahtdh

+1

Если это вас раздражает, вы всегда можете добавить предложение 'throws' в свой заголовок метода и обернуть только вызов метода в' try/catch'-block. – 11684

+0

@nhahtdh Или не инициализироваться вообще: 'int whatever;' действителен в Java. – 11684

ответ

5

Метод должен сделать одну вещь и сделать это хорошо. В этом случае ваш метод делает две вещи: бизнес-логики и обработки ошибок:

public Foo bar() { 
    try { 
     //business logic that may throw 
     //... 
     //end even more 
    } catch(BuzzException e) { 
     //Error handling 
    } 
} 

Очень часто я ловлю себя извлекая содержимое try блока в отдельный метод без обработки ошибок:

public Foo bar() { 
    try { 
     return unsafeBar(); 
    } catch(BuzzException e) { 
     //Error handling 
    } 
} 

public Foo unsafeBar() throws BuzzException { 
    //business logic that may throw 
    //... 
    //end even more 
} 
3

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

public void doComplexThing() { 
    try { 
     SomeObject o1 = doSomethingLessComplex(); 
     SomeOtherObject o2 = doSomethingElse(o1); 
     doFinalThing(o2); 
    } 
    catch (SomeException e) { 
     // handle the exception 
    } 
} 
2

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

Покрытие многих исключений в try с простым старым catch(Exception ex) приведет к головной боли позже, если вы пытаетесь проверить или найти «загадочную» ошибку. Это не говоря уже о таких вещах, как правильная обработка ресурсов/потоков, что и есть многие проверенные исключения.

1

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

Здесь я бы наклонился к try catch over the statements that need it.

Сначала давайте понимаем необходимость попытки поймать. Мы ловим исключения, так как мы хотим справиться с этим прямо здесь и сейчас. Если мы не бросим его вызывающему. Мы бросаем его так, чтобы мы не забывали обработать его позже. Никогда, Oh!, let me finish this method and then I will worry about the exception handling later. Сделайте это, пока вы код, подумайте, вам нужно распечатать ошибку и вернуть null, или вам нужно, чтобы пользователь знал, что что-то прищурилось? Вы хотите объединить все проблемы подключения с recycle the connection? Если да, то бросьте свое собственное исключение. Но не забудьте справиться с этим. Игнорирование и неправильная обработка исключений является основной причиной увеличения затрат на обслуживание проектов и сердечного ожога. Это разница между хорошим продуктом и неаккуратным продуктом.

Что касается аккуратности кода, я обнаружил, что комментарии в блоках catch делают все это стоящим. Да, будет кто-то старше вас, кто не поймет важность улавливания точного заявления и поймает catch (Exception e) напрямую. Я бы сказал, жалко. Но при кодировании вы должны придерживаться своей этики. Сделайте это правильно и сделайте это ОДИН РАЗ.

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