Я реализую Zip-Wrapper (zlib minizip) и спрашиваю себя, как правильно обрабатывать исключения.Я думаю о трех версиях.Какой вариант вы бы предпочли, или есть версия, о которой я не думал?
Задача функции Install
- получить Zip-файл с веб-сервера, распаковать его содержимое и удалитьскачанный Zip-файл.Но если при распаковке файла возникает ошибка, где следует удалить Zip-файл?
Резервуары для вашего опыта.
Версия A (с удалением вне функции):
void Install() {
getFile("upd.zip"); // Creates File
MyZip myzip("upd.zip");
myzip.unzip(); // Can't do its job --> Exception
delete("upd.zip"); // In case of exception: File would not be deleted here
}
int main() {
try {
Install();
}
catch (const Error& err) {
delete("upd.zip"); // File must be deleted here
MessageBox(err.text);
}
}
Версия B (с повторным бросанием исключения)
void Install() {
getFile("upd.zip"); // Creates File
try {
MyZip myzip("upd.zip");
myzip.unzip();
}
catch (const Error& err) {
delete("upd.zip");
throw err; // Re-Throw the Error
}
delete("upd.zip");
}
int main() {
try {
Install();
}
catch (const Error& err) {
MessageBox(err.text);
}
}
Версия C (с кодом возврата)
void Install() {
getFile("upd.zip"); // Creates File
MyZip myzip("upd.zip");
if (!myzip.unzip("upd.zip")) {
delete("upd.zip");
throw Error(myzip.geterror()); // what was the reason
}
delete("upd.zip");
}
int main() {
// Same as in Version B
}