C++ 异常安全服务器

C++ 异常安全服务器,c++,exception,server,C++,Exception,Server,我正在构建一个C++服务器库,其中库的用户将对客户端执行响应。如果程序在响应实现中遇到任何运行时错误,服务器不应该退出,它应该关闭线程/连接 我找到了两种方法 使用线程并使用_try _except以捕获异常,例如访问冲突-关闭线程 为每个连接启动一个新进程。如果不重新加载进程,对客户端的响应时间将更长,并且将使用更多的RAM 我主要对第一种选择感兴趣,但在我读过的任何论坛或论文中都不推荐它。 关键是要使服务器稳定并且永不终止 我应该使用什么选项 库的用户将实现对客户端的响应。如果程序在响应实现

我正在构建一个C++服务器库,其中库的用户将对客户端执行响应。如果程序在响应实现中遇到任何运行时错误,服务器不应该退出,它应该关闭线程/连接

我找到了两种方法

  • 使用线程并使用_try _except以捕获异常,例如访问冲突-关闭线程

  • 为每个连接启动一个新进程。如果不重新加载进程,对客户端的响应时间将更长,并且将使用更多的RAM

  • 我主要对第一种选择感兴趣,但在我读过的任何论坛或论文中都不推荐它。 关键是要使服务器稳定并且永不终止

    我应该使用什么选项

    库的用户将实现对客户端的响应。如果程序在响应实现中遇到任何运行时错误

    如果您不能100%控制正在执行的代码,那么使用多进程是使其稳定的唯一方法

    捕获任何“崩溃”SEH异常都是一项脆弱的业务。代码可能有一些bug,这些bug不会导致任何异常,但只会覆盖内存,以后会出现一些错误行为


    您仍然可以捕获这些异常,但一旦捕获到一个异常,您就应该终止该进程,因为您不知道进程的状态中还有哪些异常。(实际上,更好的方法可能是不捕获它们,让进程终止,让您有机会收集崩溃转储。)

    访问冲突只是某些平台上未定义行为的可能结果。越界内存访问是未定义的行为,并且没有可移植的机制来从中恢复。唯一的防御是预防。您需要指定确切的平台和实现,因为如果要从访问冲突中恢复,则需要使用非标准扩展。在我看来,最好的选择是防御性编程技术和异常安全代码。该库是跨平台、Windows和Linux的。x86和x64。关键是要使服务器稳定并且永不终止。选择选项2如果您想要最防弹的解决方案,我会选择选项2。在我看来,没有办法从访问违规中安全恢复。根本原因可能是重要数据的损坏。(例如:堆损坏)。这实际上取决于您所谈论的是哪种“访问冲突”。如果是编码错误导致了分段错误——正如其他人所说,选项2是唯一能够抵抗这种错误的方法。例如,如果您真正的意思是,客户机请求访问他们没有访问权限的资源,那么异常处理和选项1就可以了。