Я пытаюсь выбрать между двумя способами создания объекта и обработкой любых исключений конструктора для объекта, который критичен для моей программы, т. Е. В случае сбоя конструкции программа не может продолжиться.
У меня есть класс SimpleMIDIOut, который оборачивает основные функции Win32 MIDI. Он откроет MIDI-устройство в конструкторе и закроет его в деструкторе. Если конструктор MIDI не может быть открыт, он сгенерирует исключение, унаследованное от std :: exception.
Какой из следующих способов отлова исключений конструктора для этого объекта более соответствует рекомендациям C ++
Метод 1 - стек выделенного объекта, только в области видимости внутри блока try
#include <iostream>
#include "simplemidiout.h"
int main()
{
try
{
SimpleMIDIOut myOut; //constructor will throw if MIDI device cannot be opened
myOut.PlayNote(60,100);
//.....
//myOut goes out of scope outside this block
//so basically the whole program has to be inside
//this block.
//On the plus side, it's on the stack so
//destructor that handles object cleanup
//is called automatically, more inline with RAII idiom?
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
std::cin.ignore();
return 1;
}
std::cin.ignore();
return 0;
}
Метод 2 - Указатель на объект, выделенная куча, более структурированный код?
#include <iostream>
#include "simplemidiout.h"
int main()
{
SimpleMIDIOut *myOut;
try
{
myOut = new SimpleMIDIOut();
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
delete myOut;
return 1;
}
myOut->PlayNote(60,100);
std::cin.ignore();
delete myOut;
return 0;
}
Мне больше нравится внешний вид кода в методе 2, не нужно заклинать всю мою программу в блок try, но метод 1 создает объект в стеке, поэтому C ++ управляет временем жизни объекта, которое больше настроиться на философию RAII, не так ли?
Я все еще новичок в этом, поэтому любые отзывы по этому поводу очень ценятся. Если есть еще лучший способ проверить / обработать сбой конструктора в такой связи, пожалуйста, дайте мне знать.