V2EX 前天 12:15
[Python] go 转 Python 的心智负担增加
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文对比了Go和Python在异常处理方面的差异,探讨了Python在处理外部函数调用时,由于不确定性带来的心智负担。文章通过打开文件和JSON解析的案例,展示了Python中try-except语句的使用,以及嵌套try-except的必要性。作者认为,Python的异常处理机制使得编写健壮程序时需要格外关注函数可能抛出的异常,增加了开发者的思考成本。

🤔 Go语言通过返回值和err来处理错误,代码简洁,心智负担较小。例如,打开文件和JSON解析的错误处理都通过检查err实现。

⚠️ Python在处理文件和JSON解析时,需要考虑文件不存在、open()执行异常以及json.load()的异常等多种情况,增加了错误处理的复杂性。

💡 Python的try-except语句用于捕获异常,但将多种异常合并到一个Exception中,难以定位具体错误原因。为了更精确地处理异常,可能需要嵌套try-except语句。

🤯 Python开发者需要对每个外部函数调用都考虑其可能抛出的异常,这增加了编写健壮程序的认知负担。相比之下,Go语言的错误处理机制更为直接。

之前写 go ,go 调用函数的时候,有问题就是通过 返回值 有没有 err 来判断。心智负担很小,直接撸就行。

一个简单的案例,打开文件,然后 json 解析。go 版本是

func TestA(t *testing.T) {  fd, err := os.OpenFile("a.txt", os.O_RDWR, 0666)    if err != nil {     fmt.Println("打开文件失败", err)  }   defer fd.Close()    var data map[string]string  err = json.NewDecoder(fd).Decode(&data) if err != nil {     fmt.Println("解析文件失败", err)  }   fmt.Println(data)}

但是到 python 这边

f = open("a.json")data = json.load(f)f.close()

但是吧

    如果文件不存在需要处理文件存在,open() 执行异常了要处理json.load() 会不会异常?我跳转源码看 josn.load()源码也没看到他会返回哪些异常信息。

所以我写出这种代码

try: with open("a.json", "r") as f:      data = json.load(f)except Exception as e:   print(e)

但是这样把多种异常合到一个 Exception 了,如果出现异常,你不知道是哪个函数调用出现的异常。所以就需要这样。

try:   with open("a.json", "r") as f:      try:            data = json.load(f)     except Exception as e:          print(e)        except Exception as e:  print(e)

然后我发现,最大的问题就是,我每次调用一个外部函数的时候,TMD 根本不知道这个函数会不会异常,总不能每个函数调用都用 try/except 处理一下?

try: f1()except Exception as e:  print(e)    try:    f2()except Exception as e:  print(e)    try:    f3()except Exception as e:  print(e)

写 python 给我的感受就是,想写好一个健壮的程序,有很大的心智负担,我总是要考虑我调用的函数会不会有异常。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Go Python 异常处理 错误处理
相关文章