C语言错误处理:错误码 vs 异常
2026/8/23大约 1 分钟
C语言错误处理:错误码、goto 与异常
C 语言没有 try/catch 异常机制。嵌入式中常见的错误处理方式主要有两种:
一、错误码
错误码是嵌入式最常见的方式。
typedef enum
{
OK = 0,
ERR_TIMEOUT,
ERR_PARAM
} Error;
Error uart_send(uint8_t *data, int len);调用者根据返回值判断:
Error ret = uart_send(data, len);
if (ret != OK)
{
// 错误处理
}STM32 HAL 也是这种思想:
HAL_StatusTypeDef ret;
ret = HAL_UART_Receive(&huart1, buf, 10, 1000);
if (ret != HAL_OK)
{
// 错误处理
}错误码负责:
告诉上层“发生了什么错误”。
二、goto 集中清理
当一个函数需要申请多个资源时,如果中途失败,可以使用 goto 统一释放。
典型 Linux 内核风格:
int init(void)
{
if (step1())
goto fail_1;
if (step2())
goto fail_2;
return 0;
fail_2:
cleanup_2();
fail_1:
cleanup_1();
return -1;
}这样可以避免大量重复的清理代码。
核心:
错误负责向后跳,资源负责逆序释放。
三、为什么嵌入式通常不用异常?
C 本身没有标准异常机制;即使 C++ 支持异常,在很多嵌入式项目中也可能因为:
- 运行时开销难以预测
- 代码体积增加
- 栈和内存开销增加
- 实时性、确定性要求
而选择禁用或避免异常。
四、核心原则
底层函数
↓
返回错误码
↓
上层判断
↓
goto 统一清理资源
↓
决定重试 / 恢复 / 进入故障状态嵌入式错误处理:错误码负责传递错误,
goto负责集中清理,整个过程简单、高效、可控。

