ZeroMQ文档白嫖:聊聊ZeroMQ对错误的处理方式
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、错误分类及处理
-
错误一般分为:内部错误、外部错误
- 内部错误一般是由自身程序导致的,程序绝不允许有内部错误的存在
- 外部错误,一般由外部传入,当程序接收到外部错误之后需要自己做处理(处理或是丢弃)
二、断言
- 断言对于健壮的代码绝对是至关重要的,在C/C++中,断言会导致应用程序立即停止并报错。在其他语言中,你可能会得到异常或暂停
- 在C/C++中,会在优化的代码中将断言完全删除,所以不要过度使用assert()
三、外部错误处理
- 当检测到外部故障时,它会将一个错误返回给调用代码。如果你使用的绑定语言不是C,该绑定语言可能会为你处理错误,但是在C语言中,你需要自己做这个工作
-
这里有一些简单的规则,首先是POSIX的约定:
- 如果创建对象的方法失败,它们就会返回NULL
- 处理数据的方法可以返回处理的字节数。如果发生错误则返回-1
- 其他方法返回0表示成功,返回-1表示错误或失败
- 错误代码在errno或zmq_errno()中提供
- 描述错误的文字记录是由zmq_strerror()提供的
四、errrno、zmq_errno()、zmq_strerror()
errrno全局变量
zmq_errno()函数
int zmq_errno(void);
- API参考手册:http://api.zeromq.org/master:zmq-errno
-
功能:为调用线程检索当前errno的值,也就是返回上面的errno全局变量
-
描述说明:
- 该函数一般用于非POSIX系统上无法直接获取errno值的应用程序。具体来说,在Win32系统上,用户可以调用该函数来获取errno的值
- 没有遇到检索errno正确值问题的用户不应该使用此函数,而应该直接访问errno变量
-
返回值:
- 成功:返回调用线程的errno变量的值
- 失败:不会有失败的情况
zmq_strerror()函数
const char *zmq_strerror (int errnum);
// 无法初始化上下文时打印错误字符串
void *ctx = zmq_ctx_new(1, 1, 0);
if (!ctx)
{
printf ("Error occurred during zmq_ctx_new(): %s\n", zmq_strerror (errno));
abort ();
}
五、两个非致命的错误
-
下面是两个特殊的错误,是非致命的:
- 将一个线程使用ZMQ_DONTWAIT选项调用zmq_msg_recv()并且没有等待数据时,ØMQ将返回-1,并将errno设置为EAGAIN
- 当一个线程调用zmq_ctx_destroy()而其他线程正在做阻塞工作时,zmq_ctx_destroy()调用关闭该上下文,所有的阻塞调用都用-1退出,并将errno设置为ETERM
六、演示案例
- 我是小董,V公众点击"笔记白嫖"解锁更多【ZeroMQ】资料内容。
