ZeroMQ:11---基础篇之(ØMQ错误处理、zmq_errno()、zmq_strerror()、演示案例(使用kill信号的流水线模式))

一、错误分类及处理

  • 错误一般分为:内部错误、外部错误
    • 内部错误一般是由自身程序导致的,程序绝不允许有内部错误的存在
    • 外部错误,一般由外部传入,当程序接收到外部错误之后需要自己做处理(处理或是丢弃)

二、断言

  • 断言对于健壮的代码绝对是至关重要的,在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);
  • API参考手册:http://api.zeromq.org/master:zmq-strerror
  • 功能:获取ØMQ错误消息的字符串表现形式
  • 描述说明:
    • zmq_strerror()函数将返回一个指针,该指针指向errnum参数指定的错误编号对应的错误消息字符串
    • 由于ØMQ定义了操作系统定义的错误号以外的其他错误号,因此ØMQ的应用程序应该优先使用这个函数而不是标准的strerror()函数
    • 关于strerror()函数参阅:https://blog.csdn.net/qq_41453285/article/details/88924769
  • 参数:错误编码
  • 返回值:
    • 成功:返回一个指向错误消息字符串的指针
    • 失败:不会有失败的情况
  • 演示案例:
// 无法初始化上下文时打印错误字符串
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

五、演示案例

待续

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/106817702