Сообщение Re[9]: Разработка на чистом C от 01.11.2016 18:07
Изменено 01.11.2016 18:26 antropolog
Здравствуйте, push, Вы писали:
A>>Я код возврата выдам напрямую в параметр коллбека. А вот что будешь ты делать с исключением — пока загадка.
P>Код возврата чего? Ты же сказал, что даешь свой коллбек асинхронному фреймворку — ну у тебя возникла проблема и куда что возвращаешь?
код возврата OpenFile. Я зову асинхронно функцию OpenFileAsync, передаю ей коллбек для возврата результата. Коллбек on_result(FILE). У меня не возникло проблем. Проблемы у тебя, где поставить try catch.
P>>>Я так понимаю начинаем придумывать как сделать плохо с помощью С++?
я хочу понять как сделать хорошо с исключениями
A>>коллбеках которые вызываются из другого контекста ( другой тред, очередной цикл event-loop ).
P>std::promise/std::future
зачем мне эти инструменты? Это монады для вытаскивания отложенных значений. В моём примере коллбек зовётся только тогда, когда результат (или его отсутствие) уже готов. Зачем здесь promise/future?
A>>Великолепно. Осталось только узнать, как OpenFile понимает, ожидается ли возникновение ошибки клиентским кодом или не ожидается?
P>
Это с какой такой радости он должен что-то понимать??? Такое в принципе невозможно. Он сигнализирует о проблеме, а дальше это уже проблема клиента как реагировать.
A>>Что если таки ожидается и я в случае ошибки беру данные из другого файла/сети/whatever?
P>Ну и бери. И что?
Ох. Тяжело
Смотри:
Очевидно, что для клиентского кода, ошибка в случае OpenFile и ReadFromNetFile вполне ожидаема, и для неё отдельные бранчи. Как loadData будет выглядеть в случае с исключениями?
P>Если в твоей проге это нормальный flow — то не бросай исключение.
Всмысле не бросай? OpenFile и ReadFromNetFile писал не я, а фанат исключений. И он решил что эти функции должны всегда бросать исключение в случае неудачи (push не даст соврать).
P>А в общем случае — отсутствие файла это исключение, так как его наличие должно было быть обеспечено раньше (да, в разработке принято проверять наличие чего-либо, прежде чем использовать).
Вот это новости. Правильно ли я понимаю, что я должен всегда чекать всё, что потребуется OpenFile, чтобы она ненароком не выкинуло исключений? (ну там, наличие файла, права доступа, количество доступных файловых хендлов в системе, ну итд ).
P>Чем именно неудобно — что сказал правду об отсутствии файла?
тем что вынуждает меня приседать с исключениями. Ещё раз, напиши loadData, только так чтоб OpenFile/OpenFileFromNetwork возвращали FILE/NETFILE соответственно в случае успеха, и бросали исключение в случае неудачи
P>Я вообще-то разрабатываю на плюсах и знаю как и что. С помощью исключений можно получить без напряга столько инфы, сколько при ручном сборе с помощью кодов возврата никогда не будет (ибо банально слишком трудоёмко). Открой для себя boost::exception. По пути раскрутки стека можно собрать практически дамп всех слоёв приложения.
Про раскрутку стека и асихронные вызовы вроде и так всё понятно, это сразу фейл. Но даже с синхронными вызовами, какого типа исключения должен ловить фремворк, например, который зовёт твои функции? (Подсказка: Откуда он будет знать про твои типы исключений? И про boost::exception?
)
A>>Я код возврата выдам напрямую в параметр коллбека. А вот что будешь ты делать с исключением — пока загадка.
P>Код возврата чего? Ты же сказал, что даешь свой коллбек асинхронному фреймворку — ну у тебя возникла проблема и куда что возвращаешь?
код возврата OpenFile. Я зову асинхронно функцию OpenFileAsync, передаю ей коллбек для возврата результата. Коллбек on_result(FILE). У меня не возникло проблем. Проблемы у тебя, где поставить try catch.
P>>>Я так понимаю начинаем придумывать как сделать плохо с помощью С++?
я хочу понять как сделать хорошо с исключениями
A>>коллбеках которые вызываются из другого контекста ( другой тред, очередной цикл event-loop ).
P>std::promise/std::future
зачем мне эти инструменты? Это монады для вытаскивания отложенных значений. В моём примере коллбек зовётся только тогда, когда результат (или его отсутствие) уже готов. Зачем здесь promise/future?
A>>Великолепно. Осталось только узнать, как OpenFile понимает, ожидается ли возникновение ошибки клиентским кодом или не ожидается?
P>
A>>Что если таки ожидается и я в случае ошибки беру данные из другого файла/сети/whatever?
P>Ну и бери. И что?
Ох. Тяжело
Смотри:
optional<DATA> loadData(filename) {
optional<DATA> data;
if ( optional<FILE> f = OpenFile(filename) ) {
// OK. File is found.
data = ReadFromFile(*f);
}
else if ( optional<NETFILE> f = OpenFileFromNetwork( config::get_remote_url() + filename) )
{
// Otherwise, try to open file from network share
data = ReadFromNetFile(*f);
}
else if ( optional<FILE> f = OpenFile("default.file") )
{
// Otherwise, try to read data from the default file
data = ReadFromFile(*f);
}
else if ( optional<NETFILE> f = OpenFileFromNetwork(config::get_remote_url() + "default.file") )
{
// Otherwise, try to read data from the default file from network
data = ReadFromNetFile(*f);
}
return data;
}Очевидно, что для клиентского кода, ошибка в случае OpenFile и ReadFromNetFile вполне ожидаема, и для неё отдельные бранчи. Как loadData будет выглядеть в случае с исключениями?
P>Если в твоей проге это нормальный flow — то не бросай исключение.
Всмысле не бросай? OpenFile и ReadFromNetFile писал не я, а фанат исключений. И он решил что эти функции должны всегда бросать исключение в случае неудачи (push не даст соврать).
P>А в общем случае — отсутствие файла это исключение, так как его наличие должно было быть обеспечено раньше (да, в разработке принято проверять наличие чего-либо, прежде чем использовать).
Вот это новости. Правильно ли я понимаю, что я должен всегда чекать всё, что потребуется OpenFile, чтобы она ненароком не выкинуло исключений? (ну там, наличие файла, права доступа, количество доступных файловых хендлов в системе, ну итд ).
P>Чем именно неудобно — что сказал правду об отсутствии файла?
тем что вынуждает меня приседать с исключениями. Ещё раз, напиши loadData, только так чтоб OpenFile/OpenFileFromNetwork возвращали FILE/NETFILE соответственно в случае успеха, и бросали исключение в случае неудачи
P>Я вообще-то разрабатываю на плюсах и знаю как и что. С помощью исключений можно получить без напряга столько инфы, сколько при ручном сборе с помощью кодов возврата никогда не будет (ибо банально слишком трудоёмко). Открой для себя boost::exception. По пути раскрутки стека можно собрать практически дамп всех слоёв приложения.
Про раскрутку стека и асихронные вызовы вроде и так всё понятно, это сразу фейл. Но даже с синхронными вызовами, какого типа исключения должен ловить фремворк, например, который зовёт твои функции? (Подсказка: Откуда он будет знать про твои типы исключений? И про boost::exception?
Re[9]: Разработка на чистом C
Здравствуйте, push, Вы писали:
A>>Я код возврата выдам напрямую в параметр коллбека. А вот что будешь ты делать с исключением — пока загадка.
P>Код возврата чего? Ты же сказал, что даешь свой коллбек асинхронному фреймворку — ну у тебя возникла проблема и куда что возвращаешь?
код возврата OpenFile. Я зову асинхронно функцию OpenFileAsync, передаю ей коллбек для возврата результата. Коллбек on_result(FILE). У меня не возникло проблем. Проблемы у тебя, где поставить try catch.
P>>>Я так понимаю начинаем придумывать как сделать плохо с помощью С++?
я хочу понять как сделать хорошо с исключениями
A>>коллбеках которые вызываются из другого контекста ( другой тред, очередной цикл event-loop ).
P>std::promise/std::future
зачем мне эти инструменты? Это монады для вытаскивания отложенных значений. В моём примере коллбек зовётся только тогда, когда результат (или его отсутствие) уже готов. Зачем здесь promise/future?
A>>Великолепно. Осталось только узнать, как OpenFile понимает, ожидается ли возникновение ошибки клиентским кодом или не ожидается?
P>
Это с какой такой радости он должен что-то понимать??? Такое в принципе невозможно. Он сигнализирует о проблеме, а дальше это уже проблема клиента как реагировать.
A>>Что если таки ожидается и я в случае ошибки беру данные из другого файла/сети/whatever?
P>Ну и бери. И что?
Ох. Тяжело
Смотри:
Очевидно, что для клиентского кода, ошибка в случае OpenFile и ReadFromNetFile вполне ожидаема, и для неё отдельные бранчи. Как loadData будет выглядеть в случае с исключениями?
P>Если в твоей проге это нормальный flow — то не бросай исключение.
Всмысле не бросай? OpenFile и ReadFromNetFile писал не я, а фанат исключений. И он решил что эти функции должны всегда бросать исключение в случае неудачи (push не даст соврать).
P>А в общем случае — отсутствие файла это исключение, так как его наличие должно было быть обеспечено раньше (да, в разработке принято проверять наличие чего-либо, прежде чем использовать).
Вот это новости. Правильно ли я понимаю, что я должен всегда чекать всё, что потребуется OpenFile, чтобы она ненароком не выкинуло исключений? (ну там, наличие файла, права доступа, количество доступных файловых хендлов в системе, итд ).
P>Чем именно неудобно — что сказал правду об отсутствии файла?
тем что вынуждает меня приседать с исключениями. Ещё раз, напиши loadData, только так чтоб OpenFile/OpenFileFromNetwork возвращали FILE/NETFILE соответственно в случае успеха, и бросали исключение в случае неудачи
P>Я вообще-то разрабатываю на плюсах и знаю как и что. С помощью исключений можно получить без напряга столько инфы, сколько при ручном сборе с помощью кодов возврата никогда не будет (ибо банально слишком трудоёмко). Открой для себя boost::exception. По пути раскрутки стека можно собрать практически дамп всех слоёв приложения.
Про раскрутку стека и асихронные вызовы вроде и так всё понятно, это сразу фейл. Но даже с синхронными вызовами, какого типа исключения должен ловить фремворк, например, который зовёт твои функции? (Подсказка: Откуда он будет знать про твои типы исключений? И про boost::exception?
)
A>>Я код возврата выдам напрямую в параметр коллбека. А вот что будешь ты делать с исключением — пока загадка.
P>Код возврата чего? Ты же сказал, что даешь свой коллбек асинхронному фреймворку — ну у тебя возникла проблема и куда что возвращаешь?
код возврата OpenFile. Я зову асинхронно функцию OpenFileAsync, передаю ей коллбек для возврата результата. Коллбек on_result(FILE). У меня не возникло проблем. Проблемы у тебя, где поставить try catch.
P>>>Я так понимаю начинаем придумывать как сделать плохо с помощью С++?
я хочу понять как сделать хорошо с исключениями
A>>коллбеках которые вызываются из другого контекста ( другой тред, очередной цикл event-loop ).
P>std::promise/std::future
зачем мне эти инструменты? Это монады для вытаскивания отложенных значений. В моём примере коллбек зовётся только тогда, когда результат (или его отсутствие) уже готов. Зачем здесь promise/future?
A>>Великолепно. Осталось только узнать, как OpenFile понимает, ожидается ли возникновение ошибки клиентским кодом или не ожидается?
P>
A>>Что если таки ожидается и я в случае ошибки беру данные из другого файла/сети/whatever?
P>Ну и бери. И что?
Ох. Тяжело
Смотри:
optional<DATA> loadData(filename) {
optional<DATA> data;
if ( optional<FILE> f = OpenFile(filename) ) {
// OK. File is found.
data = ReadFromFile(*f);
}
else if ( optional<NETFILE> f = OpenFileFromNetwork( config::get_remote_url() + filename) )
{
// Otherwise, try to open file from network share
data = ReadFromNetFile(*f);
}
else if ( optional<FILE> f = OpenFile("default.file") )
{
// Otherwise, try to read data from the default file
data = ReadFromFile(*f);
}
else if ( optional<NETFILE> f = OpenFileFromNetwork(config::get_remote_url() + "default.file") )
{
// Otherwise, try to read data from the default file from network
data = ReadFromNetFile(*f);
}
return data;
}Очевидно, что для клиентского кода, ошибка в случае OpenFile и ReadFromNetFile вполне ожидаема, и для неё отдельные бранчи. Как loadData будет выглядеть в случае с исключениями?
P>Если в твоей проге это нормальный flow — то не бросай исключение.
Всмысле не бросай? OpenFile и ReadFromNetFile писал не я, а фанат исключений. И он решил что эти функции должны всегда бросать исключение в случае неудачи (push не даст соврать).
P>А в общем случае — отсутствие файла это исключение, так как его наличие должно было быть обеспечено раньше (да, в разработке принято проверять наличие чего-либо, прежде чем использовать).
Вот это новости. Правильно ли я понимаю, что я должен всегда чекать всё, что потребуется OpenFile, чтобы она ненароком не выкинуло исключений? (ну там, наличие файла, права доступа, количество доступных файловых хендлов в системе, итд ).
P>Чем именно неудобно — что сказал правду об отсутствии файла?
тем что вынуждает меня приседать с исключениями. Ещё раз, напиши loadData, только так чтоб OpenFile/OpenFileFromNetwork возвращали FILE/NETFILE соответственно в случае успеха, и бросали исключение в случае неудачи
P>Я вообще-то разрабатываю на плюсах и знаю как и что. С помощью исключений можно получить без напряга столько инфы, сколько при ручном сборе с помощью кодов возврата никогда не будет (ибо банально слишком трудоёмко). Открой для себя boost::exception. По пути раскрутки стека можно собрать практически дамп всех слоёв приложения.
Про раскрутку стека и асихронные вызовы вроде и так всё понятно, это сразу фейл. Но даже с синхронными вызовами, какого типа исключения должен ловить фремворк, например, который зовёт твои функции? (Подсказка: Откуда он будет знать про твои типы исключений? И про boost::exception?