因为之前的一篇文章,"我不会抛弃python而是用Go",这两天看了很多讨论和文章,有些想法
异常
1,符合“速错”的原则,在python鼓励是用Exception,而非错误码和条件检查
2,异常通常可以返回完整的调用堆栈,可以方便程序员定位错误和分别进行处理或统一处理
3,你可以选择catch异常,或是不catch,你可以定义自己的异常,提供更具体的通知
4,一般在系统边界用try-catch,比如读取文件,访问网络,访问数据库等
5,异常是要消耗一部分性能的,尤其是.net的应用程序
条件检查和错误码
1,如果你返回错误码,那么就是在告诉调用方,这个方法永远是有响应的,虽然有可能出错,但总能返回,你在这个函数黑盒会尽可能的进行输入检查等其他防御式的编程
2,错误码很方便代码review,这个我真不知道根据是什么
3,如果调用方忘了检查错误码,等到程序崩溃,那么鬼都不知道哪里出错了,异常优于错误码就在于不会悄悄的崩溃,而是visible failure
4,错误码的使用者认为错误码的方式是为了编写非常严格的软件产品,异常是懒程序员的做法
何时使用异常和错误码呢?
1,取决于我们在哪一层编写代码
如果是业务层,从在系统边界处捕捉异常的观点出发,我们应该尽可能的检查输入,如果是数据库访问,这里用太多未知错误,我们可能会不断往上抛异常
2,取决于我们用的编程语言
如果是C/GO,那就仔细检查我们的错误码吧,如果是python,那么就EAFP吧,尽量用try-catch,如果是Java,这货就比较麻烦,他的异常又分为检查异常和非检查异常,其实检查异常就是python中的异常,非检查异常就是错误了,从我见过的代码看,好像Java中还是条件检查和异常捕捉双管齐下的,等高人来说说吧
3,取决于带给程序员的负担
对于python这种动态语言来说,虽然语言鼓励你使用try-catch,但是你既然不知道要catch什么,难道大家写python代码的时候都去查文档的吗,对于C来说,显然代码是随着错误码的增加而增加的,而且要考虑非常多的情况,或许这就是C程序员值钱的地方????
4,取决于你在写的产品
如果你写一个服务器,你不会因为几个非法输入或类型错误就崩溃,然后不响应吧,所以说,对于这种持久响应的产品,我觉得错误码或许是一个比较好的方式,它强迫你必须慎重思考该如何处理
5,
You shouldn't throw exceptions for things that happen all the time. Then they'd be "ordinaries".
这句话真不懂
最后的问题,big problem
对于我们可预见的、并且可以handle的错误我们需要异常吗?
比如说访问了一个字典中不存在的key值,比如说两个对象相加,但是两者类型不一,我们需要先检查还是直接异常呢?
异常
1,符合“速错”的原则,在python鼓励是用Exception,而非错误码和条件检查
2,异常通常可以返回完整的调用堆栈,可以方便程序员定位错误和分别进行处理或统一处理
3,你可以选择catch异常,或是不catch,你可以定义自己的异常,提供更具体的通知
4,一般在系统边界用try-catch,比如读取文件,访问网络,访问数据库等
5,异常是要消耗一部分性能的,尤其是.net的应用程序
条件检查和错误码
1,如果你返回错误码,那么就是在告诉调用方,这个方法永远是有响应的,虽然有可能出错,但总能返回,你在这个函数黑盒会尽可能的进行输入检查等其他防御式的编程
2,错误码很方便代码review,这个我真不知道根据是什么
3,如果调用方忘了检查错误码,等到程序崩溃,那么鬼都不知道哪里出错了,异常优于错误码就在于不会悄悄的崩溃,而是visible failure
4,错误码的使用者认为错误码的方式是为了编写非常严格的软件产品,异常是懒程序员的做法
何时使用异常和错误码呢?
1,取决于我们在哪一层编写代码
如果是业务层,从在系统边界处捕捉异常的观点出发,我们应该尽可能的检查输入,如果是数据库访问,这里用太多未知错误,我们可能会不断往上抛异常
2,取决于我们用的编程语言
如果是C/GO,那就仔细检查我们的错误码吧,如果是python,那么就EAFP吧,尽量用try-catch,如果是Java,这货就比较麻烦,他的异常又分为检查异常和非检查异常,其实检查异常就是python中的异常,非检查异常就是错误了,从我见过的代码看,好像Java中还是条件检查和异常捕捉双管齐下的,等高人来说说吧
3,取决于带给程序员的负担
对于python这种动态语言来说,虽然语言鼓励你使用try-catch,但是你既然不知道要catch什么,难道大家写python代码的时候都去查文档的吗,对于C来说,显然代码是随着错误码的增加而增加的,而且要考虑非常多的情况,或许这就是C程序员值钱的地方????
4,取决于你在写的产品
如果你写一个服务器,你不会因为几个非法输入或类型错误就崩溃,然后不响应吧,所以说,对于这种持久响应的产品,我觉得错误码或许是一个比较好的方式,它强迫你必须慎重思考该如何处理
5,
You shouldn't throw exceptions for things that happen all the time. Then they'd be "ordinaries".
这句话真不懂
最后的问题,big problem
对于我们可预见的、并且可以handle的错误我们需要异常吗?
比如说访问了一个字典中不存在的key值,比如说两个对象相加,但是两者类型不一,我们需要先检查还是直接异常呢?