Здравствуйте,
я понимаю, что косовато задал вопрос, попробую пояснить на примере. Когда мы работаем, например, с libusb, мы пишем как-то так
ret = libusb_init(&ctx); //Инициализация библиотеки
if (ret < 0) { //Что-то странное, libusb работать не хочет
goto init_err_mark;
}
devh = libusb_open_device_with_vid_pid(ctx, 1234, 5285);
if(devh == NULL) { //Устройство не открылось
goto devh_err_mark;
}
ret = libusb_claim_interface(devh, 0);
if(ret < 0) { //Интерфейс не открывается
goto iface_err_mark;
}
... //Собственно работаем с устройством
//Освобождаем ресурсы
libusb_release_interface(devh, 0);
iface_err_mark:
libusb_close(devh);
devh_err_mark:
libusb_exit(ctx);
init_err_mark:
return ret;
т.е. сначала инициализируем ресурс, причём ошибка на любом шаге инициализации означает прекращение работы, а потом в обратном порядке ресурсы освобождаем. Такой код немного неудобно читать и писать, отвлекаешься на ветки "что-то пошло не так". Прошу подсказать способ писать сценарии корректной работы и обработки ошибок раздельно, у меня монады, future и promise в голове перемешались.