c开发策略
当使用任何语言进行应用程序开发时,我们应该提前计划如何处理错误。而Java和c++一般使用异常来处理错误。但是,由于C语言没有提供非常优雅的异常机制,所以知道如何处理错误是非常重要的。C语言中处理错误的方法有很多种,概括起来就是:大家可以讨论一下这些方法的优缺点,这样我们在以后的程序开发中就可以从整体上为程序设计更好的错误处理方法。
1.返回值方法:用函数的返回值来标记函数是否成功执行。例如,成功返回1,失败返回0。这种方法的优点是简单方便,而且不影响效率,保持了C语言的高效率。但还是有问题。一个问题是代码的可读性。如果每个函数都有这样的返回值,为了保持程序正确运行,就必须验证每个函数的正确性,也就是在调用函数的时候检查它的返回值,这样可能会把很大一部分程序代码花在错误处理上。第二个问题是函数返回值的冲突。假设strlen函数也有可能出错,使用这种错误处理策略,他的返回值应该会标记是否被成功执行,但是函数计算出来的字符串的长度值如何自然的传递出去呢?最后一个问题可能是最重要的:它不强迫你处理错误,程序不处理仍然可以运行,但是结果不可预测。
2.全局errno方法:当错误发生时,错误代码被记录到一个全局变量errno中。例如,当waitpid()函数被信号中断时,errno被设置为EINTR(一个宏定义常数)。这种方法解决了返回值方法遇到的返回值冲突问题,效率也很令人愉悦。但是,它要求用户在调用该函数后检查errno的值。这种保证是脆弱的,程序仍然有可能在不处理这些错误的情况下“安全地”运行,从而导致不确定的结果。另一个问题在于多线程。errno不是线程安全的,多个线程操作同一个errno会造成混乱。
3.错误封装:也就是说,每个带有错误返回值的函数都被包装在一个函数中。比如waitpid()函数可以封装成Waitpid()(首字母大写),对应的错误在这个函数中处理。这种错误处理方法可以很好地解决很多问题。应该说效果很好,但是有几个方面需要商榷。首先,并不是每个函数错误都以单一的方式处理。另一方面,据说C语言的函数调用成本比较高,在函数外面再包裹一层会影响性能。
4.异常:异常的解释和实现请参见
。它的优点是可以模拟c++中实现异常的一些优点。但是这种异常机制是非常脆弱的,使用的时候要注意很多问题,它的性能开销肯定会不小。
5.goto语句:发生错误时,使用Goto语句跳转到相应的错误处理函数。由于对goto语句的偏见和goto语句本身对程序结构的影响,我从来没有用过这种方法,不知道这种方法的优缺点会是什么。
总的来说,每种方法都不是完美的。我想知道你是如何处理这些问题的?
0条评论