错误处理
仗剑独行(58****82)10:37:35
void main(){
FILE *fp = open(); //假定fp是有效的
char *p = malloc(100); //假定也获得了内存
if(test()==error)
{
//这里的错误处理其实就是放掉资源
//关闭句柄,放掉之前申请的内存之类
fclose(fr);
free(p);
}
...
}
仗剑独行(58****82)10:38:00
你们公司的错误处理是这个意思吧
SH_漫总#MM(2*****48)10:38:35
fopen?
一看就不是我们写的代码
SH_漫总#MM(2*****48)10:39:11
FILE *fp = open(); //假定fp是有效的
无论怎么样这里必须检查fp
char *p = malloc(100); //假定也获得了内存
无论怎么样这里必须检查p
仗剑独行(58****82)10:39:16
描述意图的代码嘛
SH_漫总#MM(2*****48)10:39:20
其他差不多
仗剑独行(58****82)10:39:23
不必认真
SH_漫总#MM(2*****48)10:39:22
嗯
SH_漫总#MM(2*****48)10:39:33
继续
仗剑独行(58****82)10:39:35
//这里的错误处理其实就是放掉资源
//关闭句柄,放掉之前申请的内存之类
SH_漫总#MM(2*****48)10:39:42
嗯
仗剑独行(58****82)10:40:19
因为你们代码不允许出现错误就终止程序,程序还是要持续运行
SH_漫总#MM(2*****48)10:40:38
这么定义不太准确
仗剑独行(58****82)10:40:50
哦?
SH_漫总#MM(2*****48)10:40:53
应该说,我们程序只有停止一次的机会
SH_漫总#MM(2*****48)10:40:59
就是开始的时候
SH_漫总#MM(2*****48)10:41:06
只要开始了,就不允许停止了
SH_漫总#MM(2*****48)10:41:27
所以我估计你想问的是这个?
仗剑独行(58****82)10:43:53
实际上,大多数函数都会依赖其他函数,也会自己申请一些东西(例如申请内存,打开文件之类的),一旦被依赖的函数说我发生错误了,没法提供你所需要的功能,这个时候调用它的函数就会开始释放自己占用的资源,并向上报告
SH_漫总#MM(2*****48)10:44:09
没这个问题
仗剑独行(58****82)10:44:20
没吗?》
SH_漫总#MM(2*****48)10:44:22
我们从来不临时占用资源
SH_漫总#MM(2*****48)10:44:33
代码中没有一个malloc, new之类的东西
SH_漫总#MM(2*****48)10:44:41
我们程序只有停止一次的机会
就是开始的时候
只要开始了,就不允许停止了
仗剑独行(58****82)10:44:46
文件句柄呢?
SH_漫总#MM(2*****48)10:44:47
想想怎么才能做到这一点
SH_漫总#MM(2*****48)10:45:14
在开玩笑吗?几千人在线玩游戏的时候去读写文件?
仗剑独行(58****82)10:45:40
就没有临时申请的资源嘛
SH_漫总#MM(2*****48)10:45:40
即使有,也是开始的时候申请,过后就没这事了
SH_漫总#MM(2*****48)10:45:51
没有
仗剑独行(58****82)10:46:09
那你的错误处理部分都是些啥代码!
SH_漫总#MM(2*****48)10:46:21
就是释放内存池啥的
仗剑独行(58****82)10:48:24
那你的意思是这样的
void main(){
char *p = AllocFromPool(100); //假定从内存池得了内存
if(test()==error)
{
//这里的错误处理是把内存还给内存池
FreeToPool(p);
}
...
}
SH_漫总#MM(2*****48)10:48:41
嗯
仗剑独行(58****82)10:49:54
那我有个事情需要确认下了,在c++,c#,java语言里,程序异常后,这些资源会自动释放吗
SH_漫总#MM(2*****48)10:50:17
C#和java看GC,C++绝对不会
Ricky(1001903)10:52:07
java党友情路过,凡事指望gc会过错年的,遇到有类似释放资源的方法,还是手工调用一下比较好。
仗剑独行(58****82)10:52:17
漫总,你们的代码会试图从错误中恢复嘛
仗剑独行(58****82)10:52:23
呵呵ricky总
SH_漫总#MM(2*****48)10:54:09
我们代码没啥所谓的从错误中恢复的问题
SH_漫总#MM(2*****48)10:54:16
错误也是正常处理的一环
SH_漫总#MM(2*****48)10:54:33
把错误处理从正常处理中分离出去非常危险,很容易忽视错误处理
仗剑独行(58****82)10:55:03
ricky总又是个啥情况呢
Ricky(1001903)10:55:53
既然是“错误”了,大部分时候是没法恢复的。把这个事件回滚,同时记录下来就好了。
SH_漫总#MM(2*****48)10:56:23
实际上没有所谓的错误
SH_漫总#MM(2*****48)10:56:37
所谓的错误流程是编程的一种常见误区
SH_漫总#MM(2*****48)10:56:40
一定要认识到
SH_漫总#MM(2*****48)10:56:51
错误就是程序正常逻辑的一环
SH_漫总#MM(2*****48)10:57:14
程序执行有10条分支,其中3条是符合你预期的,7条是不符合你预期的
SH_漫总#MM(2*****48)10:57:28
你需要一样的同等的处理这10条分支
SH_漫总#MM(2*****48)10:57:45
因为这10条都是客观存在和不可避免的逻辑
SH_漫总#MM(2*****48)10:57:59
只有分支,没有什么错误流程正确流程的说法
SH_漫总#MM(2*****48)10:58:07
每条分支都小心的去处理,就够了
Ricky(10*****3)10:58:17
漫总已经说得很明确了。
SH_漫总#MM(2*****48)10:59:18
因此我们不存在对错误流程的处理,只有对各种流程不同分支的对应处理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述