当前位置: 首页 > 面试题库 >

在Python中捕获所有异常的好主意

柯立果
2023-03-14
问题内容

为什么在Python中捕获所有异常不是一个好主意?

据我所知,追赶使用的所有例外except:条款,甚至会搭上“特别”蟒蛇例外:SystemExitKeyboardInterrupt,和GeneratorExit。那么,为什么不使用except Exception:子句来捕获所有异常呢?


问题答案:

因为它非常不明确,并且无法使您对异常做任何有趣的事情。而且,如果您捕获了每个异常,则可能会发生很多甚至不知道正在发生的异常(这可能导致您的应用程序失败,而您实际上并不知道为什么)。您应该能够(通过阅读文档或进行实验)特别地预测需要处理哪些异常以及如何处理它们,但是如果您从一开始就盲目地抑制所有这些异常,您将一无所知。

因此,应大家的要求,这里有个例子。程序员正在编写Python代码,她得到了一个IOError。她决定不进行进一步调查,而是决定捕获所有异常:

def foo():
    try:
        f = open("file.txt")
        lines = f.readlines()
        return lines[0]
    except:
        return None

她没有用他的方式意识到问题:如果文件存在并且可以访问,但文件为空怎么办?然后此代码将引发一个IndexError(因为列表lines为空)。因此,她将花费数小时来思考为什么None文件存在时为什么要从该函数中恢复,并且如果没有更明确地捕获错误(如果她正在访问可能不存在的数据)而没有意识到这一点,那么就不会意识到这一点。



 类似资料:
  • 问题 怎样捕获代码中的所有异常? 解决方案 想要捕获所有的异常,可以直接捕获 Exception 即可: try: ... except Exception as e: ... log('Reason:', e) # Important! 这个将会捕获除了 SystemExit 、 KeyboardInterrupt 和 GeneratorExit 之外的所有异常。

  • 我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否

  • 这是我第一次问有关stackoverflow的问题。对不起,我的英语很差,英语不是我的母语。 我写了这样一个try/except条款: 当结果中没有“主机名”键时,它会出现一个KeyError异常。当我运行我的代码时,我看到异常已经被捕获,因为logger.error(e)在我的日志文件中放置了一个日志。但是它仍然引发了一个异常,没有返回这个{“retcode”: 1,“描述”:“失败”}。 异常

  • 问题内容: 我试过了 在主方法中,在start(Stage primaryStage)方法中也是如此。它没有用。 我也试过 异常堆栈跟踪。 在javafx.concurrent.Task $ TaskCallable $ 2.run(Task.java:1251)在com.sun.javafx.application.PlatformImpl $ 3.run(PlatformImpl.java:1

  • 问题内容: 我想捕获一个特定的ValueError,而不仅仅是任何ValueError。 我试过这样的事情: 但这会引发SyntaxError:无法分配给文字。 然后我尝试了: 但这引发了例外,即使这是我要避免的例外。 问题答案: 在,是例外,而不是字符串的实例。因此,当您测试不等于特定字符串时,该测试始终为False。尝试: 代替。 例: 通常,如果可以帮助您,您并不是真的希望依赖于错误消息-这