欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

Python 对异常与错误的处理策略,用 try...except,还是 if...else...,哪种比较好?

程序员文章站 2022-05-02 13:53:21
...
Beginning Python From Novice to Professional, 2nd Edition, CHAPTER 8, EXCEPTIONS, Page 173:

正文中这样描写:


The point is that using try/except statements is in many cases much more natural (more “Pythonic”) than if/else, and you should get into the habit of using them where you can.1


注释:


1. The preference for try/except in Python is often explained through Rear Admiral Grace Hopper’s words of wisdom, “It’s easier to ask forgiveness than permission.” This strategy of simply trying to do something and dealing with any errors, rather than doing a lot of checking up front, is called the Leap Before You Look idiom.


————————————————————————————————


Python 基础教程(第2版),第8章,异常,第136页:


在很多情况下,使用try/except语句比使用if/else会更自然一些(更“Python化”),应该养成尽可能使用if/else语句的习惯。 ①


①try/except语句在 Python 中的表现可以用海军少将Grace Hopper的妙语解释:“请求宽恕易于请求许可。”在做一件事时去处理可能出现的错误,而不是在开始做事前就进行大量的检查,这个策略可以总结为习语“看前就跳(Leap Before You Look)”。


—————————————————————————————————


我对前面英文的理解是要让读者多用 try/except,而中文的翻译是说多用 if/else,是我理解错了,还是翻译的有错误?

回复内容:

Dustin Getz's blog

用monad最好。 没有最好的方式。
如果命中的可能性比较大,那就用 try...except...,反之用 if...else...,原因是尽量减少索引检查和生成异常。 本文讲的码农版Python技巧的确是鼓励用try,大致上你的代码应该是一个try block,下面跟着一串except处理各种异常,而不是每一个语句外面套一个if。

要高端的请参见monad…… 我也同意用monad,但是python那个lambda配合他的缩进实在是太丑了。 你理解的没错,翻译有错误。

但此书英文版作者对if-else和try-except的理解,个人觉得并不是正确的。

方式的存在必然有其应用的场景,不要手里有了锤子就看什么都是钉子。

简单来讲,作为使用者,应该按照所使用库的习惯来决定用那种方式处理错误,如果库使用throw则try,如果库使用return则if。
而自己的模块,根据开发时间和模块的重要性的不同而选择不同模式。
如,开发时间短,脚本为临时性的则try-except;如代码比较关键要求稳定,如出错c需要详细的错误提示则if-else。

所以,正确的习惯不是去习惯有某一个,而是应该具体问题具体分析根据具体场景选择问题的解决方式。 Python 对异常与错误的处理策略,用 try...except,还是 if...else...,哪种比较好? Python 对异常与错误的处理策略,用 try...except,还是 if...else...,哪种比较好?
题主买到盗版了~ 上个月看的,印象还挺深的,我记得书中明明是try/except .明天回学校,书都已经放包里了,睡觉之前刷刷知乎,看到这问题,翻出来看了看,嗯,我没记错,题主应该是买到盗版了。╮(╯▽╰)╭
再说下我的一些个人看书心得吧,看这种技术书,总会碰到一些暂时没有理解的句子,这时不要总是作死的揪着她们不放,重点是看这句话的目的是什么(比如阐述一种编程概念或技巧),这个目的通常就是句子所处段落的小标题了,所以先把那句话放一边,接着往下看,也许就把目的弄明白了。
同一件事情,不同的人因为各自不同的经历和环境就会有不同的描述方法,作者写书是为了传播与分享某种技术,大多数作者不是技术的创造者,我们看书的目的是要掌握这种技术,能利用这种技术用于生产实践,而不需要对作者阐述这种技术的语句给理解的不差毫厘。就比如你弄懂一项技术时,你在像他人讲解这门技术时,就必定会带有你自己的个人风格特点了。 碎觉鸟,明早6点多就得起床赶班车克市里坐火车回校,回校再从书中找几个例子~
PS:用手机码的,发布时总出现图片正在上传中,请稍后。。。醉了
===========================================
1月9号更新:用pc上传了书的封面及举例,还有简单分了下段落。
比如我在看到第九章的八皇后问题时(当时我并不明白八皇后的意思),如果按我以前的做法,我会先搜索一下八皇后的概念后才来看,但是并没有那个必要,因为作者举八皇后的目的是为了让我们掌握如何用生成器解决复杂的递归问题,而不是了解八皇后这个概念,而且我们在接下来的代码阅读理解中,自然而然就明白了八皇后的概念,这样就不用分心搜索而导致没必要的时间浪费了。 try except 我觉得try except足够,既可以快速查错,方便定位,也可以避免由于未知错误造成的瘫痪。 两种情况:
1.未知的异常用try...except.
2.可预见的可以用if..else..处理下。
----------
python的异常处理没java的强大。 我比较喜欢scala的错误处理机制。没有if else 没有try catch 没有NullException。

Scala提供了Option机制来解决,代码中不断检查null的问题。再见 NullException

这个例子包装了getProperty方法,使其返回一个Option。 这样就可以不再漫无目的地null检查。只要Option类型的值即可。

使用pattern match来检查是常见做法。也可以使用getOrElse来提供当为None时的默认值。

给力的是Option还可以看作是最大长度为1的List,List的强大功能都可以使用。


def getProperty(name: String): Option[String] = {
val value = System.getProperty(name)
if (value != null) Some(value) else None
}

val osName = getProperty("os.name")

osName match {
case Some(value) => println(value)
case _ => println("none")
}

println(osName.getOrElse("none"))

osName.foreach(print _)
输出结果:
linux
linux
linux
参考地址:Scala Tour