如何检测磁盘已满的未处理异常?

时间:2013-01-14 00:46:10

标签: c++ unhandled-exception clog

我的应用程序遇到了磁盘已满错误,不知何故,由于磁盘已满,导致出现未处理的异常,导致调用set_terminate()处理程序。

通常,我会在我的日志文件中获得某种堆栈跟踪,所以我可以看到出了什么问题,但是,在这种情况下,因为磁盘已满,没有记录堆栈跟踪,并且不清楚该程序由于磁盘空间不足而终止。

从写入磁盘的最后一些内容中读取我可以写入的内容std::clog正在被写入,该文件已设置为磁盘(已满的磁盘)。

我想知道使用operator<<写入clog是否会导致抛出异常,如果是这样,可能会抛出什么异常?

此外,我对如何改进我的应用程序的想法很感兴趣,如果将来再次出现这种情况,我可能会更新我的应用程序,留下更好的错误,以便我知道磁盘已满,而不是应用程序的其他缺点。

然而,关键问题是检测到失败,如果没有这个,关于如何缓解的想法是没有用的。

2 个答案:

答案 0 :(得分:2)

在Linux中,您可以使用文件名[在特殊目录中?]来创建您所在位置的路径 - 因为文件只会占用“i-node space”,这通常有很多。

另一种选择是创建一个大型(ish)文件作为“紧急日志存储” - 如果磁盘已满,则打开紧急日志存储,然后写入该文件。使它成为几兆字节,并且没有人会注意到现代磁盘,但它为您提供了足够的空间来转储您所处位置的上下文。

答案 1 :(得分:2)

我不知道代码本身会发生什么的细节,但我想解决如何处理这种异常的问题。

本质上是这种问题,其中更多的日志记录将是有用的。但是,您必须考虑日志记录机制是否存在问题。您需要有一个不依赖磁盘的备用日志/报告系统。

您可以继续添加冗余层,但在我看来,在特殊情况下失败的主要版本,以及在更多异常情况下失败的备份对于大多数应用程序来说已经足够了。如果数据弹性是最重要的,那么当然你会在应用程序处理过程中监视你的资源并减轻(发出操作员警告或你选择什么作为你的后备机制 - 例如备份假脱机空间等)。

一般而言,all ways upnearly always up相比的成本遵循80/20规则中的成本和开发时间。