zlos
> Кидаем исключение, исключение летит, объекты сами убиваются при выходе за
> области видимости.
Я веду речь о ситуации, когда нам не нужно убивать все объекты, а наоборот - стоит задача "держаться до последнего".
И вообще, вы там не в idSoftware работаете? Мне за Rage, который вылетал каждые 5 минут убивать охота.
Ogra
> стоит задача "держаться до последнего"
Это как вообще? Если вы не можете выделить например память - вы не можете продолжать текущую работу и должны вернуться куда то назад откуда уже можно попробовать что то другое.
zlos
Не всегда вернуться куда-то
Пример - в менеджере ресурсов 2000 объектов, нужно добавить еще 10.000, загрузив их по сети, но на 5.000 возникает исключение - "Нельзя прочитать файл". Падать из-за обрыва на линии? Убивать закачанные 5.000 объектов? Запускать программу без нужных данных?
DevilDevil
>архитектуру надо проектировать так, чтобы exception-ов не было
Покажи мастер-класс:
vector.size = 100500; vector.size = -1; img.load("./file_not_exist.xpm"); shader.compileFromeFile( "./bad_syntax.cg"); img = Image( "./file_not_exist.xpm"); render.start( lost_devie );
Pushkoff
> моя парадигма мышления называется KISS, почитай о ней в интернете
Адаптация для русских :)
zlos
> Кидаем исключение, исключение летит, объекты сами убиваются при выходе за
> области видимости.
{
beginAlgo( some_data );
vector<int> tmp;
while( tmp.size( ) ){
tmp.resize( algoStep( some_data) );
// ловим out_of_memory и...
}
endAlgo( );
}Ogra
> Падать из-за обрыва на линии? Убивать закачанные 5.000 объектов? Запускать программу без нужных данных?
продолжай. а то не понятно к чему ты это написал.
Try
> { beginAlgo( some_data ); vector<int> tmp; while( tmp.size() ){ tmp.resize(
> algoStep(some_data) ); // ловим out_of_memory и... } endAlgo(); }
ты хочешь написать тут
finally {
endAlgo();
}
да?
Try
Ага, можно подумать, что исключения (только обязательно с finally! ;) ) вдруг сразу волшебным образом решают проблему консистентность данных при возникновении нештатной ситуации...
Try
> vector.size = -1; // wtf ?
Pushkoff
человек не обладающий здоровой долей сомнения - обречён развиваться крайне медленно
человек не дающий себе права ошибаться - стоит на месте
можно конечно считать что угодно
но не изучив вопрос, не попробовав - по меньше мере глупо
yatagarasu
нет, я не об этом.
Я о том, что часть действий, который нужны алгоритму нам удалось выполнить, при этом мы меняли some_data, а потом обнаружили, что дальше работать не можем.
Здесь, ни GC, ни RAII не помогут.
К примеру мы пытались сделать счетную сортировку ( которой как-раз нужна дополнительная память ) и получили out_of_memory на середине - надо бы откатить some_data к исходному состоянию, но не получится сделать это просто.
yatagarasu
Речь о том, что иногда даже при исключении "нехватка памяти" можно не ронять программу и сохранить её работоспособность. Не говоря уже о других, более мелких исключениях. В таких случаях необходимо следить за целостностью объектов. Делать это в системе, построенной на исключениях в языке без поддержки finally - геморрой ;)
DevilDevil
> > vector.size = -1; // wtf ?
Ты уверен, что этого не будет?
Ты уверен, что ты, или твой коллега не ошибется в этом месте?
Ты считаешь, что можно забить?
Ты знаешь, что будет если этот код попытается работать?
Try
> К примеру мы пытались сделать счетную сортировку ( которой как-раз нужна дополнительная память ) и получили out_of_memory на середине - надо бы откатить
> some_data к исходному состоянию, но не получится сделать это просто.
не понятно к какому исходному состоянию ты собрался откатывать some_data ? ты же его нигде не сохранил. даже не понятно какие ты операции проводил над some_data, так что тут даже поговорить не о чем.
сферический конь в вакууме какой-то. давай опиши твою пракическую ситуацию, где тебе помог finally, (или не помог, на самом деле даже не понятно решил ты эту проблему или нет)
Ogra
> Речь о том, что иногда даже при исключении "нехватка памяти" можно не ронять
> программу и сохранить её работоспособность. Не говоря уже о других, более
> мелких исключениях. В таких случаях необходимо следить за целостностью
> объектов. Делать это в системе, построенной на исключениях в языке без
> поддержки finally - геморрой ;)
к сожалению я понимаю о чем ты говоришь. я видел очень много такого кода, в котором программист решает созданные самому же себе проблемы.
например мы добавим объект в список игровых объектов, потом загрузим в него данные из ресурсов, а если что-то пошло не так, в finally проверим, правильно ли он загрузился, если нет то удалим его.
какой логичный алгоритм я придумал =) лол.
Try
> DevilDevil
> > > vector.size = -1; // wtf ?
> Ты уверен, что этого не будет?
> Ты уверен, что ты, или твой коллега не ошибется в этом месте?
>
> Ты считаешь, что можно забить?
> Ты знаешь, что будет если этот код попытается работать?
Прекрасно если это будет
Возникнет Exception и покажет на место ошибки. Ошибка быстро исправится
С RAII в C++ есть одна проблемка. Что делать, если при освобождении ресурса может произойти нештатная ситуация? Классический пример - при закрытии буферизированного потока необходимо сделать flush. Что делать в ситуации, когда он по какой-то причине не получился (например, пользователь тупо флэшку вытащил)? Кидать исключение из деструктора - а если мы в раскрутке стэка в результате предидущего исключения?
yatagarasu
> например мы добавим объект в список игровых объектов, потом загрузим в него
> данные из ресурсов, а если что-то пошло не так, в finally проверим, правильно
> ли он загрузился, если нет то удалим его.
> какой логичный алгоритм я придумал =) лол.
Вот до слов "удалим его" все было правильно ;) Это конечно лучше, чем "упадем", но все равно фигня какая-то.
Что-то представилось даже - идет игра с бесшовным миром, асинхронно подгружается новый объект, по мере подгрузки он показывается на экране. Вот отрисовался mesh, вот наложилась текстура, а вот сейчас ляжет bump... Бададыщ! Игра упала. Или объект пропал. Прелесть! ;) (Хотите более правдоподобный сюжет? Ок - загрузка юзер-пикчи в ММО. А сервер, который раздает статику упал).
Тема в архиве.