【问题标题】:How to detect unhandled exception due to disk full?如何检测由于磁盘已满而导致的未处理异常?
【发布时间】:2012-12-27 21:58:25
【问题描述】:

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

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

从最后写入磁盘的内容中读取我所能读取的内容,似乎std::clog 正在被写入,已设置为写入磁盘(已满的那个)。

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

此外,我对如何改进我的应用程序的想法很感兴趣,以便如果这种情况在未来再次发生,我可能会更新我的应用程序,以便更好地跟踪到底出了什么问题,这样我就可以知道磁盘已满,而不是应用程序的其他缺点。

但是,关键问题是检测故障,否则,如何缓解的想法就毫无用处。

【问题讨论】:

    标签: c++ unhandled-exception clog


    【解决方案1】:

    在 Linux 中,您可以使用文件名 [在一个特殊的目录中?] 来创建您所在位置的踪迹 - 因为文件只会占用通常很多的“i-node 空间”。

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

    【讨论】:

      【解决方案2】:

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

      从本质上讲,这类问题需要更多的日志记录。但是,您必须考虑日志记录机制是否是这里的问题。您需要有一个不依赖于磁盘的替代日志/报告系统。

      您可以继续添加冗余层,但在我看来,在异常情况下失败的主数据库,再加上在更多异常情况下失败的备份对于大多数应用程序来说已经足够了。如果数据弹性至关重要,那么您当然会在处理应用程序时监控您的资源并缓解(发出操作员警告或您选择作为后备机制的任何东西 - 例如备份假脱机空间等)。

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

      【讨论】:

      • 如果在写入磁盘时我可以检测到释放磁盘并允许写入成功,则我只能在磁盘已满时释放磁盘上的保留空间。这又回到了我的问题,写入 clog 可能会引发什么异常?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 2022-12-03
      相关资源
      最近更新 更多