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

 

一位Go程序员分享了在Python中处理异常的经验与困惑。文章对比了Go语言通过返回值处理错误的方式,以及Python中使用try-except捕获异常的机制。作者在编写Python代码时,发现需要频繁使用try-except块来处理潜在的异常,导致心智负担增加,并对Python的异常处理机制提出了自己的看法和思考。

🤔 Go语言通过返回值和err来处理错误,程序员能够清晰地知道哪些函数可能出错,从而更容易编写健壮的代码。

💡 Python使用try-except块来捕获异常,虽然提供了灵活性,但也增加了心智负担。程序员需要预先考虑函数可能抛出的各种异常,并编写相应的处理代码。

⚠️ Python的异常处理机制使得程序员难以预知哪些函数可能抛出异常。为了编写健壮的代码,需要对每个外部函数调用都进行try-except处理,增加了代码的复杂性。

🧐 作者认为,Python的异常处理机制使得编写健壮的程序变得困难,因为程序员需要时刻关注函数可能抛出的异常,并编写相应的处理代码,这增加了代码的复杂性和维护难度。

之前写 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

相关标签

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