之前写 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 给我的感受就是,想写好一个健壮的程序,有很大的心智负担,我总是要考虑我调用的函数会不会有异常。