是否在c++中为Socket库使用异常

Whether to use exceptions in C++ for Socket library?

本文关键字:异常 Socket c++ 中为 是否      更新时间:2023-10-16

我计划用c++编程语言构建一个可移植的Socket库。众所周知,在网络编程中,错误是经常发生的。其中一些是可以恢复的,而另一些则不能。我计划在c++中使用异常来跟踪异常,做一些日志操作并通知最终用户。然而,使用异常是极其困难的,并且使用错误码等经典技术将导致代码难以阅读(大量if语句)。你的偏好是什么?

顺便问一下,有没有轻量级的套接字库(教育用途的是受欢迎的,像Ace这样的东西真的很难理解)?

使用返回码的缺点是人们会忘记错误处理。这种情况不可能有例外。但是,如果您编写的返回代码类在其析构函数中断言,除非读取或显式忽略返回值,否则您可以获得返回值的可移植性和性能,而不会出现错误处理不良的缺点。如果调用者需要处理异常,您仍然需要手动转发错误代码。

这个问题的答案都归结为您希望在哪里以及如何处理错误条件。

异常处理在解析器中真正发挥作用的时候,需要从一些深度嵌套的代码中返回,然后才有意义地处理错误。检查错误代码将是一个无用的负担。

IO可能略有不同,因为至少在接近故障点的某种程度上处理错误是有意义的。如果允许错误向上传播,将失去上下文,使错误处理无效。

无论您决定做什么,始终记录故障点,以便以后可以正确地调试它。异常往往会隐藏故障点,使调试变得非常困难。

我计划用c++编程语言构建一个可移植的Socket库。

好主意。但是你可以看看有没有现成的。

众所周知,在网络编程中,错误是经常发生的。

是的。

其中一些是可恢复的,而另一些则不可恢复。

那你的偏好是什么?

两者的组合。

在我的套接字库内部,我在函数之间使用错误码。检查结果并采取适当的措施。如果操作是可恢复的(即只是重新尝试读取),则不使用异常。如果问题无法恢复,那么我会抛出异常,因为我无法在套接字库中修复它,解析需要更多上下文,因此抛出异常并允许使用代码根据使用情况强制执行正确的解析。

顺便问一下,有没有轻量级的套接字库(教育用途的是受欢迎的,像Ace这样的东西真的很难理解)?

没有文档,但是非常容易使用:

https://github.com/Loki-Astari/ThorsSocket

如果你想看到一个套接字包装成c++流的样子:

https://github.com/Loki-Astari/ThorsStream