【发布时间】:2012-03-19 21:32:34
【问题描述】:
对该主题进行了一些阅读,但无法得出结论。如果我试图在堆上分配一个 QFile(例如)并且如果文件抛出某种异常,我想丢弃它并继续处理下一个对象(恢复不会成为问题)。我的一些代码如下所示:
void FileUploader::uploadNext() {
if(!canceled_) {
if((iterator_ + 1) < (start_ + offset_)) {
iterator_++;
_mutex.lock();// lock the fileList for the other threads.
fileList_[iterator_].uploadStarted();
try {
_item = new QFile((fileList_.at(iterator_).fileInfo()).filePath());
} catch(std::bad_alloc) {
// emit error
// log
_mutex.unlock();
return uploadNext(); // upload next
}
// in setupInfoFile I also want to try-catch so I dont set the objects properties if it wasen't allocated.
InfoFile *temp = this->setupInfoFile("test", fileList_.at(iterator_).fileInfo(), false);
if(temp != NULL) {
temp ->setSomething("test")
_mutex.unlock();
// send the file to a networkAccessManager that will come back with signals
_realFileUploader->addFile(temp, _item);
} else {
_mutex.unlock();
_item->deleteLater();
// emit error
// log
return uploadNext();
}
emit statusChangedAt(iterator_);
} else emit finished();
} else emit canceled();
}
这里我有一个共享列表(与其他线程共享,因此是锁定的),我将逐步执行并创建两个我将尝试上传的对象。如果它无论如何都失败了,我想从中恢复并上传下一个项目。我该怎么做?
阅读 Qt 文档后,如果分配失败,某些对象只会返回 Null 指针,因为某些操作系统甚至不会抛出 bad_alloc 异常。他们还建议将 try-catch 块放在 main 周围,该块将处理有关例如内存的任何异常,然后让应用程序退出。我不想要那个。
那么在这种情况下我该如何处理异常或进行错误处理呢? Qt这句话是什么意思?
目前,从 Qt 中抛出的异常(例如由于内存不足)中恢复的唯一受支持用例是退出事件循环并在退出应用程序之前进行一些清理。
谢谢!
另外:这可能是一个非常愚蠢的问题,但是如果我在函数的堆栈上创建一个 QMutexLocker,当发生错误时会超出范围,那么锁定有多深?锁定是否像堆栈上的普通变量一样工作,因为它也不会锁定被调用函数中的内容?
【问题讨论】:
-
这里的问题是,如果你不能为一个 QFile 分配空间,你很可能在下一个 QFile 上也会失败。
-
那么我应该在为 QFile 分配时捕获任何东西还是应该让应用程序优雅地死掉?
-
另外,如果我没有捕捉到异常,互斥锁会被解锁还是会死锁?
标签: c++ qt exception-handling