Я проект, основные выглядетьC++ код стал не линейным при использовании исключения
Object a;
if (! a.initialize(x, y, z))
return EXIT_FAILURE;
// 100 lines using a
a.finalize();
Я пытался изменить эту часть кода и с помощью RAII idiome. Итак, я удаляю функцию initialize
и finalize
и перемещаю код в конструкторе и деструкторе.
Чтобы уловить ошибку initialize()
, я создаю исключение в конструкторе, если что-то не работает.
Итак, мой код выглядит следующим образом:
try
{
Object a(x, y, z);
// 100 lines using a
} catch (my_exception&)
{
return EXIT_FAILURE;
}
думать, что беспокоит это 100 строк кода. Мой try
слишком длинный для одной ошибки. И у меня есть несколько объектов вроде a
.
поэтому перед мой код был линейным:
Object a;
if (! a.initialize(x, y, z))
return EXIT_FAILURE;
Object b;
Object c;
if (!b.initialize() || !c.initialize())
return EXIT_FAILURE;
a.finalize();
Теперь это выглядит некрасиво, трудно читать:
try
{
Object a(x, y, z);
try
{
Object b;
try
{
Object c;
}
catch (my_exception_c&)
{
return EXIT_FAILURE;
}
}
catch (my_exception_b&)
{
return EXIT_FAILURE;
}
} catch (my_exception&)
{
return EXIT_FAILURE;
}
Как сделать, чтобы использовать RAII и сохранить код ясно?
Не чистая RAII - это то, где ctors может выйти из строя без метания, а объекты RAII записывают такой сбой. Он похож на гибрид ваших двух примеров, но очистка ресурсов происходит автоматически в предложениях об ошибке возврата. – Yakk