技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

错误处理

仗剑独行(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
因此我们不存在对错误流程的处理,只有对各种流程不同分支的对应处理。

posted on   codestyle  阅读(244)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示