Supongamos que construyo un objeto RAII, y ese objeto puede fallar al construirlo. ¿Cómo manejo esto?Cuando un objeto RAII falla al construir
try {
std::vector<int> v(LOTS);
// try scope ends here because that's what the catch is for
} catch(const std::bad_alloc&) {
// ...
}
// v? what v?
Por supuesto, el constructor por defecto de std::vector
no va a tirar y que puede ayudar, pero esto no es el caso general. Un constructor puede arrojar muy bien. Si deseo manejar cualquier falla en la adquisición de recursos, ¿cómo puedo hacer eso mientras sigo siendo capaz de proceder si no tiene tiro?
Editar: Para aclarar, mi problema es que si un recurso no puede adquirir, es posible que desee intentarlo de nuevo, y así sucesivamente. Tal vez pueda intentar adquirir un recurso alternativo.
No exactamente seguro de lo que es la cuestión. El código que usa v debe estar en el bloque try. – Dialecticus
Según entiendo la pregunta, el problema es que para poder recuperar una excepción en el constructor de 'v',' v' debe declararse dentro del alcance 'try', lo que significa que ya no se puede visible * después de * el bloque 'catch'. Entonces, si usted tiene un código que por un lado necesita poder "ignorar" una excepción cuando construye 'v', y por otro lado, ser capaz de usar' v' si la construcción tuvo éxito, se vuelve un poco complicado – jalf
Si recurso no puede adquirir entonces tal vez puedo hacer con otro recurso en lugar de dejar que la excepción se propague. Y si ese segundo recurso falla, entonces tal vez tenga otra idea, y así sucesivamente. Siento que esto lleva a un desastre en el código sin importar el enfoque que tome. RAII simplemente describe cómo limpiar en caso de falla, no cómo resolver la falla. – wilhelmtell