Другая ситуация, при которой finally
является полезной, заключается в том, чтобы обеспечить освобождение «ручных» замков (для этой цели предусмотрены блокировки, реализованные с синхронизирующими структурами языка, для этого используются finally
). Тем не менее, при выполнении этой функции иногда возникает недоумение: блокировки часто приобретаются для того, чтобы позволить коду мгновенно нарушать инварианты объекта и восстанавливать их, прежде чем кто-либо еще сможет заметить. Если возникает исключение, которое оставило бы инварианты объекта в ненадлежащем состоянии, правильное поведение, как правило, не должно оставлять блокировку, но, скорее, убедитесь, что переменная установлена, чтобы указать, что произошло, и кто-нибудь, кто приобретает блокировку, проверяет это переменную и выставить исключение, если оно установлено.
Если один инкапсулирует замок-это-действует переменный в пределах объекта блокировки, код может выглядеть следующим образом:
void insertItem(...)
{
try
{
myLock.acquire();
myLock.enterDanger();
...
myLock.leaveDanger();
}
finally
{
myLock.release();
}
}
кодекса, который никогда не модифицирует охраняемый объект, а просто читает его никогда не придется «enterDanger» ,Если release
вызывается, пока замок все еще находится в состоянии danger
, он может захотеть захватить текущую трассировку стека; ожидающие или будущие звонки в myLock.acquire
должны генерировать исключение, возможно, включая трассировку стека в качестве дополнительной информации.
Обратите внимание, что можно было бы попробовать вместо того, чтобы аннулировать myLock
в catch
блоке, но один должен затем убедиться, что никто не добавляет catch
блок к блоку try
обрабатывать ожидаемые исключения без нарушения блокировки. Если ожидаемое исключение происходит в непредвиденном месте, охраняемый объект может быть оставлен в коррумпированном состоянии без запуска catch
, который должен был аннулировать его (выполнение более конкретного улова предотвратит выполнение менее специфического).
log, код процесса, который вы хотите выполнить, даже если сбой или успех – nachokk
Например, это может быть очень полезно откат транзакции, когда запрос на вставку/обновление/удаление базы данных не выполнен. – Kloe2378231