14. 文本转换、错误与程序生命周期
C 没有内建的异常机制。本章把三类单文件程序经常同时遇到的能力放在一起:用断言检查内部前提、把文本可靠地转换为数值并处理错误,以及控制程序怎样正常或异常结束。
三类问题
| 场景 | 推荐手段 | 目的 |
|---|---|---|
| 程序内部前提被破坏 | assert | 在启用断言时报告失败并终止。 |
| 文本需要转换为受范围约束的数值 | strto*、返回值和 errno | 区分无输入、格式错误和超出范围。 |
| 程序需要结束或登记退出处理 | return、exit、quick_exit、_Exit、abort | 明确不同终止路径会执行哪些清理。 |
重要
定义了 NDEBUG 后,assert 会被移除,其表达式也不会被求值。因此不能用断言处理必须在发布版本中检查的输入或运行失败。
本章内容
习题
#11401
⚡1⏳2
分别给出一个例子,说明“应该用 assert”与“应该用返回值 + errno”的区别;并解释原因。
#11402
⚡1⏳2
设计一个函数 int parse_u32(const char* s, uint32_t* out);:
- 当
s == NULL或out == NULL时,选择assert还是返回错误?说明理由。 - 当字符串不是合法数字或超出范围时,返回什么错误信息(错误码/
errno)?说明理由。