子程序
- 引入中间、易懂的抽象
- 避免代码的重复
- 子类化
- 隐藏顺序(合并需要顺序的操作)
- 隐藏指针的操作
- 提高可移植性
- 子程序长度:50~150
子程序的参数
- 输入,修改,输出的顺序
- 子程序的个数在7个之内
防御性编程
非法数据的破坏
- 外部数据值
- 子程序输入参数值
- 如何处理错误
断言
- assert用来捕捉的是程序员自己的错误。永远不应该发生的错误
- exception捕捉的是用户或者环境的错误。捕捉预期会发生的事情。
- 不要将需要执行的代码放入断言
健壮的代码:先使用断言处理错误,再使用错误处理
c语言的错误处理
- <assert.h> <script type="math/tex" id="MathJax-Element-1"> </script>
- 检查输入参数的合理性
// crt_assert.c
// compile with: /c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
//输出
Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file assert.cpp, line 25
abnormal program termination
*例子
void* memcpy(void *dst, const void *src, size_t count)
{
//安全检查
assert( (dst != NULL) && (src != NULL) );
unsigned char *pdst = (unsigned char *)dst;
const unsigned char *psrc = (const unsigned char *)src;
//防止内存重复
assert(!(psrc<=pdst && pdst<psrc+count));
assert(!(pdst<=psrc && psrc<pdst+count));
while(count--)
{
*pdst = *psrc;
pdst++;
psrc++;
}
return dst;
}
error
- 库函数的调用错误
assert的宏定义
c语言异常
- C语言的异常机制 setjump longjump函数