Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
public void TransferMoney(Acount anotherAccount, Decimal amount)
{
this.Withdraw(amount);
// Если вторая часть операции упадет, то получим рассогласованное состояние
anotherAccount.Deposit(amount);
}
~DisposableX() {
}
private void Dispose(bool disposing)
{
// В общем, на этот флаг нам, в общем-то плевать, поскольку мы работаем только
// с неуправляемыми ресурсами...
if (_handleA != IntPtr.Zero)
CloseHandle(_handleA);
if (_handleB != IntPtr.Zero)
CloseHandle(_handleB);
}
var sr = new StreamReader();var sr = GetSomeCustomReader();Все сказанное в этой статье относится только к синхронным исключениям, поскольку гарантировать согласованное возникновении «асинхронных» исключений, таких как OutOfMemoryException или ThreadAbortException практически невозможно.
ThreadPool.QueueUserWorkItem(delegate { throw new Exception(); });// Метод класса Account
public void Transfer(Account account, Decimal value)
{
try {
Withdraw(value);
account.Deposit(value);
}
catch(Exception e)
{
// А!!! Че делать! А давайте просто запишем ошибку в лог или пробросим ее дальше
log.WriteError(e);
throw;
}
}
Думаете такого не бывает? Я встречаю такой код постоянно. Так вот, исключения здесь обрабатываются, но базовая гарантия исключений не соблюдается.
З.Ы. Повторюсь еще раз. В статье речь не только и не столько об управлении ресурсами, сколько о гарантиях обеспечения согласованного состояния приложения (что есть более общий случай).
Гарантии безопасности исключений