Есть ли смысл делать «попробуй наконец» без «улова»?

Я видел такой код:

    try
    {
        db.store(mydata);
    }
    finally
    {
        db.cleanup();
    }

Я думал, что try должен иметь catch

Почему этот код делает это так?

105 голосов | спросил glanden 10 PMpSat, 10 Apr 2010 22:37:36 +040037Saturday 2010, 22:37:36

6 ответов


0

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

public void yourOtherMethod() {
    try {
        yourMethod();
    } catch (YourException ex) {
        // handle exception
    }
}    

public void yourMethod() throws YourException {
    try {
        db.store(mydata);
    } finally {
        db.cleanup();
    }
}
ответил Taylor Leese 10 PMpSat, 10 Apr 2010 22:39:35 +040039Saturday 2010, 22:39:35
0

Это происходит потому, что программист хотел убедиться, что db.cleanup() вызывается, даже если код внутри блока try вызывает исключение. Любые исключения не будут обрабатываться этим блоком, но они будут распространяться вверх только после того, как будет выполнен блок finally.

ответил Matti Virkkunen 10 PMpSat, 10 Apr 2010 22:39:19 +040039Saturday 2010, 22:39:19
0
  

Почему этот код делает это так?

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

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

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

ответил Konrad Rudolph 10 PMpSat, 10 Apr 2010 22:40:01 +040040Saturday 2010, 22:40:01
0

Блок finally гарантирует, что даже когда выдается исключение RuntimeException (возможно, из-за некоторой ошибки в вызываемом коде), вызов db.cleanup() будет сделано.

Это также часто используется для предотвращения слишком большого количества вложений:

try
{
    if (foo) return false;
    //bla ...
    return true;
}
finally
{
    //clean up
}

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

ответил FRotthowe 10 PMpSat, 10 Apr 2010 22:46:06 +040046Saturday 2010, 22:46:06
0

Код делает это, чтобы гарантировать, что база данных закрыта.
Обычно вы можете поместить весь код доступа к базе данных в блок try, а затем вызвать вызов, чтобы закрыть базу данных в блоке finally.
Способ try ... finally работает, означает, что код в блоке try запускается, а код в блоке finally запускается, когда это заканчивается ... несмотря ни на что.
Если не считать того, что компьютер выдернули из стены, наконец-то выполнится.
Это означает, что даже если вызвано исключение, и для выполнения метода требуется три года, он все равно перейдет в блок finally и база данных будет закрыта.

ответил chustar 10 PMpSat, 10 Apr 2010 22:49:45 +040049Saturday 2010, 22:49:45
0

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

Блок finally всегда выполняется независимо от того, было ли выброшено исключение или нет.

ответил THINESH VASEE 11 Jpm1000000pmThu, 11 Jan 2018 16:30:12 +030018 2018, 16:30:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132