Почему у Java есть вложенные операторы try? - PullRequest
0 голосов
/ 29 сентября 2018

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

Например:

Код 1:

try 
{
    Statement A;
    Statement B;
    try
    {
        Statement C;
        Statement D;
    }
    catch(CException e) { ... }
    catch(DException e) { ... }
}
catch(AException e) { ... }
catch(BException e) { ... }

Код 2:

try 
{
    Statement A;
    Statement B;

    Statement C;
    Statement D;
}
catch(AException e) { ... }
catch(BException e) { ... }
catch(CException e) { ... }
catch(DException e) { ... }

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

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Не совсем.

Если вы поймаете исключение на том же уровне, вы не сможете выполнить другие инструкции, когда код сгенерирует первый.

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

Некоторым просто нужно записать, что что-то произошло, а затем перейти к коду.

В другой раз вы не можете продолжатьи должны остановиться.

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

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

Поэтому имеет смысл иметь вложенные try catch блоки в соответствии с логикой, которую реализует код.

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

Причина в том, что код стал трудным для понимания.

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

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

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

0 голосов
/ 29 сентября 2018

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

try 
{
    Statement A;
    Statement B;
    try
    {
        Statement C;
        Statement D;
    }
    catch(CException e) { ... }
    catch(DException e) { ... }

    Statement E;
    Statement F;
}
catch(AException e) { ... }
catch(BException e) { ... }

E и F должны выполняться независимо от результата C и D. Как вы собираетесь сделать это с одной попытки?(Возможный ответ: продублировать кодовый блок E / F в соответствующих блоках перехвата. Не очень элегантно.)

full семантика создаваемого исключения не толькоего тип (/ class), но также и место в коде, куда оно было брошено.Сфера имеет значение.

0 голосов
/ 29 сентября 2018

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

try {
    for (int i = 0; i < 10; i++) {
        try {
            someOperationThatOftenFails();
        } catch (SomeCommonException e) {
            ...
        }
    }
} catch (SomeRareFatalException e) {
    ...
}

В этом сценарии вложенные блоки попытки являются единственным способом перехвата SomeCommonException несколько раз.не выходя из цикла, но также заставляя SomeRareFatalException выйти из цикла при первом его возникновении.

...