Является ли подобный стиль исключений Java плохой практикой? - PullRequest
8 голосов
/ 23 февраля 2010

Считается ли плохой практикой иметь несколько попыток в одном методе и структурировать код следующим образом?

public void whatever() {
   try {
     methodThatMayThrowIOException();
   } catch(IOException io) {
     // do something with exception here
   }

   // do more stuff here that won't throw exceptions

   try {
     methodThatMayThrowCustomException();
   } catch(CustomException ce) {
     // do something with custom exception here
   }
}

Ответы [ 10 ]

7 голосов
/ 23 февраля 2010

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

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

5 голосов
/ 23 февраля 2010

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

public void whatever {
    try {
        methodThatMayThrowIOException();
        // do more stuff here that won't throw exceptions
        methodThatMayThrowCustomException();
    } catch(ParentException e) {
        // do something with custom exception here
    }
}
3 голосов
/ 23 февраля 2010

Ваш код читается так, как он делает, потому что вы хотите выполнить часть 1 (и решить, перехватывая IOException, если необходимо), выполнить часть без исключений, а затем выполнить methodThatMayThrowCustomException. Ваш код буквально не может быть написан каким-либо другим способом и сохраняет ту же функциональность. Это преувеличение, но любая другая версия будет отличаться поверхностно.

Это не то же самое:

public void whatever {
   try {
     methodThatMayThrowIOException();
     // do more stuff here that won't throw exceptions
     methodThatMayThrowCustomException();
   } catch(IOException io) {
     // do something with io exception here
   } catch(CustomException ce) {
     // do something with custom exception here
   }
}

и то, как он будет выполняться, если выбрасывается какое-либо исключение, совершенно иное. Если вам нужно последовательно восстановить часть 1, нажать часть 2 в любом случае , а затем перейти к части 3, вы действительно не сможете написать свой код другим способом.

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

3 голосов
/ 23 февраля 2010

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

public void whatever {
   try {
     methodThatMayThrowIOException();
     // do more stuff here that won't throw exceptions
     methodThatMayThrowCustomException();
   } catch(IOException io) {
     // do something with io exception here
   } catch(CustomException ce) {
     // do something with custom exception here
   }
}

Здесь вы можете быстро сказать, что если IOException выбрасывается, то вы делаете только то, что находится внутри блока catch, и ничего больше.

3 голосов
/ 23 февраля 2010

выглядит нормально, но это зависит от того, что делают methodThatMayThrowIOException и methodThatMayThrowCustomException, и от того, должен ли сбой первого (methodThatMayThrowIOException) завершиться весь метод whatever.

2 голосов
/ 23 февраля 2010

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

1 голос
/ 23 февраля 2010

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

Тем не менее, если вы уверены, что в одном блоке try ... catch определенный тип исключений будет выдан только уникальной функцией, и их размещение в том же блоке try тоже нормально.

1 голос
/ 23 февраля 2010

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

0 голосов
/ 23 февраля 2010

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

0 голосов
/ 23 февраля 2010

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

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