This article很好地概述了结构化异常处理为何不好的原因。有没有办法获得阻止服务器崩溃的稳健性,同时克服文章中提到的问题?
我有一台服务器软件,可以同时运行大约400个连接用户。但如果发生崩溃,则所有400名用户都会受到影响。我们添加了结构化异常处理并享受了一段时间的结果,但最终不得不删除它,因为一些崩溃导致整个服务器挂起(这比让它崩溃并重新启动更糟糕。)
所以我们有这个:
答案 0 :(得分:3)
使用SEH因为你的程序随机崩溃是一个坏主意。你可以在你的程序上撒上魔法小精灵粉尘,让它停止崩溃。追踪和修复导致崩溃的错误是正确的解决方案。
当您真正需要处理结构化异常时使用SEH很好。拉里·奥斯特曼(Larry Osterman)做了一个后续帖子,解释what situations require SEH: memory mapped files, RPC, and security boundary transitions。
答案 1 :(得分:2)
将您的程序分解为工作进程和单个服务器进程。服务器进程将处理初始请求,然后将它们从工作进程中移除。如果工作进程崩溃,则只有该工作进程的用户受到影响。不要将SEH用于一般异常处理 - 正如您已经发现的那样,它可以并且将使您对死锁完全敞开,并且您仍然可以崩溃。
答案 2 :(得分:1)
修复程序中的错误? ;)
就个人而言,我会保留SEH处理程序,让他们转出一个调用堆栈,其中包含访问冲突或发生的任何事情,并解决问题。 “有时服务器挂起”问题可能是由于线程导致死锁导致SEH异常导致某些内容被锁定,因此不太可能与您使用SEH本身有关。