免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1466 | 回复: 3
打印 上一主题 下一主题

关于错误处理(欢迎进来一起讨论) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-02 19:05 |只看该作者 |倒序浏览
是这样的,目前正在实现一个库:
o 这个库是C语言实现的,提供C语言接口(注意:是C语言,所以就不要考虑抛出异常了)
o 这个库是跨平台的──至少可以是POSIX和windows上通用的

现在遇到的一个问题,其实是一个再简单不过的问题了:错误处理

简单说来,错误处理的方法可以概括成:

  1. if( encounter_error(...) )
  2.         error(...);
复制代码


于是问题也就集中在这个error函数上面了。这个函数究竟该怎么实现,实现成什么样子呢?

一般情况是有这么几种的:

o 像W. Richar Stevens的那个错误处理库一样,把错误信息输出到标准错误输出或者日志中,然后结束进程或者返回。
但是这种方法在我这里存在几个问题:

* 因为实现的是一个库,所以把错误信息打印到标准错误输出上显然不是很恰当。例如:假如这个库被用在了一个GUI程序中,那么如果程序出现错误,最好的方式应该是输出一个错误提示框,而不是把错误输出到console下
* 如果把错误信息输出到日志文件,似乎要比打印到标准错误输出上好些。但是同样存在以上的问题:对于一个GUI程序来说,错误信息最好是可以以一个窗口(错误提示框)的形式发给用户。简单地输出到一个文件中用户会觉得十分不友好
* 很多情况下很难判断究竟是结束进程还是返回。例如:对于一个只维护一个连接的客户端来说,如果这个连接在connect的时候失败,那么进程就完全可以这样结束了。但是如果对于一个需要维护多个连接的程序来说,在其中一个connect失败的时候就结束进程显然不是很好。换句话说,究竟是结束进程还是返回,最好由上层的调用来判断,而非库本身

o errno模式。也就是说,这个库提供一个函数,类似winsock的那个WSAGetLastError一样,在错误发生时,将错误信息存储在一个errno中,用户可以在查觉到错误发生之后,调用这个函数,根据函数返回值,调用一个类似strerror的函数,获得错误描述。其实我认为这个做法是比较理想的,但是在实现的时候却遇到了几个问题:
* 并非所有的错误都可以在函数调用之后处理的。例如调用getaddrinfo之后,如果调用失败,可以将返回值作为参数调用gai_strerror来获得错误信息。可是这个函数在windows上是不存在的。而且,getaddrinfo的返回值究竟保存在什么地方,才能让它在用户调用一个获得错误信息函数(类似strerror)时得到这个值并且是线程安全的?
* 不知道windows上的errno值和UNIX上的是否一一对应,如果不是,用户则又要根据不同的系统编写自己的错误处理代码了。这样的话整个库的跨平台特性就没有任何意义了。

除此以外似乎还有一些问题,不过还没有整理好思路,暂时不说了。总之,各位有什么好得方法来进行错误处理呢?欢迎大家提供好的意见和建议。多谢了。

[ 本帖最后由 默难 于 2006-8-2 19:06 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-08-02 19:29 |只看该作者
可以做成一种错误注册的形式,你可以通过命令行观看日志,也可以通过界面查询,不过这种好像就要做一个错误日志的服务器。这是我的一点儿想法

论坛徽章:
0
3 [报告]
发表于 2006-08-02 19:33 |只看该作者
可是我目前要实现的是一个库。而非一个程序
这个库是跨平台的。如果加入一个日志查询的功能……那实现的可就不仅仅是一个库那么简单了

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-08-02 19:45 |只看该作者
自己定义错误代码,
函数出错了,就给调用者返回错误码,
具体调用者怎么处理,你不用管。
因为你不知道调用者会怎么处理,
正如你说的,在GUI情况下,他想抛出一个对话框。
又或者他想写LOG,
这个不应该是库的责任。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP