4

本文很好地概述了为什么结构化异常处理不好。有没有办法获得阻止服务器崩溃的稳健性,同时克服文章中提到的问题?

我有一个服务器软件,可以同时运行大约 400 个连接的用户。但如果发生崩溃,所有 400 个用户都会受到影响。我们添加了结构化异常处理并享受了一段时间的结果,但最终不得不将其删除,因为一些崩溃导致整个服务器挂起(这比让它崩溃并自行重启更糟糕)。

所以我们有这个:

  • 使用 SEH:400 中只有 1 个用户在大多数崩溃中遇到问题
  • 没有 SEH:如果任何用户发生崩溃,所有 400 都会受到影响。
  • 但有时与 SEH:服务器挂起,所有 400 都受到影响,未来的用户会尝试连接。
4

3 回答 3

3

使用 SEH,因为您的程序随机崩溃是一个坏主意。您可以撒在程序上以使其停止崩溃,这不是神奇的小精灵尘埃。追踪并修复导致崩溃的错误是正确的解决方案。

当您确实需要处理结构化异常时使用 SEH 很好。Larry Osterman 发表了一篇后续文章,解释了哪些情况需要 SEH:内存映射文件、RPC 和安全边界转换

于 2008-10-03T04:09:40.087 回答
2

将您的程序分解为工作进程和单个服务器进程。服务器进程将处理初始请求,然后将它们交给工作进程。如果工作进程崩溃,则只有该工作进程上的用户会受到影响。不要将 SEH 用于一般的异常处理 - 正如您所发现的,它可以而且会让您对死锁敞开大门,而且您仍然可能崩溃。

于 2008-10-02T20:24:24.743 回答
1

修复程序中的错误?;)

就我个人而言,我会保留 SEH 处理程序,让他们转储出访问冲突或发生任何事情的调用堆栈并解决问题。“有时服务器挂起”问题可能是由于线程导致的死锁导致 SEH 异常保持锁定,因此不太可能与您使用 SEH 本身的事实有关。

于 2008-10-03T07:16:45.597 回答