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

python:我怎么知道发生了什么类型的异常?

高祺
2023-03-14
问题内容

我有一个主程序调用的函数:

try:
    someFunction()
except:
    print "exception happened!"

但是在执行函数的中间会引发异常,因此它跳到了该except部分。

我如何才能准确看到someFunction()导致异常发生的原因?


问题答案:

其他答案都指出,您不应捕获通用异常,但是似乎没人愿意告诉您原因,这对于理解何时可以打破“规则”至关重要。这)是一个解释。基本上是这样,您不会隐藏:

  • 发生错误的事实
  • 发生的错误的详细信息(错误隐藏反模式)

因此,只要您不做任何事情,就可以捕获通用异常。例如,您可以通过另一种方式向用户提供有关异常的信息,例如:

  • 在GUI中将异常显示为对话框
  • 将异常从工作线程或进程转移到多线程或多处理应用程序中的控制线程或进程

那么如何捕获通用异常呢?有几种方法。如果只需要异常对象,请按照以下步骤操作:

try:
    someFunction()
except Exception as ex:
    template = "An exception of type {0} occurred. Arguments:\n{1!r}"
    message = template.format(type(ex).__name__, ex.args)
    print message

确保
message被带到用户的注意力在一个难以错过的方式!如上所示,如果将消息掩埋在许多其他消息中,则可能不够用。未能引起用户注意,就等于吞没了所有例外,如果您有一个印象,在阅读完本页上的答案后应该会消失,这
不是一件好事 。用raise语句结束except块将通过透明地重新引发捕获的异常来解决该问题。

上面的和使用except:不带任何参数的区别是双重的:

  • 裸机except:不会给您检查异常对象
  • 上面的代码通常不会捕获这些异常SystemExitKeyboardInterrupt并且GeneratorExit通常是您想要的。请参阅异常层次结构。

如果您还希望在不捕获异常的情况下获得相同的堆栈跟踪,则可以这样获得(仍在except子句内):

import traceback
print traceback.format_exc()

如果使用logging模块,则可以将异常打印到日志(以及消息)中,如下所示:

import logging
log = logging.getLogger()
log.exception("Message for you, sir!")

如果您想更深入地研究堆栈,查看变量等,请使用except块内的模块post_mortem功能pdb

import pdb
pdb.post_mortem()

我发现在寻找错误时,这最后一种方法是无价的。



 类似资料:
  • 我们有一个稍微长大的Spring webapp(在tomcat 7上),关机非常慢。(这对我们持续交付的性能有负面影响) 我的怀疑是,在@PreDestroy方法中肯定有一些bean被阻塞(或占用了很长时间)。 到目前为止,我通过给每个池、线程和计时器指定不同的名称,并确保它们要么是守护进程线程,要么被正确关闭,从而确保它与未正确关闭的线程(池)无关。 有没有人解决了这样的情况,并能给我一个如何应

  • 问题内容: 我似乎找不到有关Redis命令的有用信息。我想知道给定键值的数据类型。例如,要列出数据库的所有键,我运行以下命令: 在我的设置中,得到以下结果: 我如何知道密钥包含的数据类型?我尝试运行,但出现错误 有什么想法吗? 问题答案: 您可以使用type命令:http : //redis.io/commands/type

  • 本文向大家介绍你知道JavaScript Symbol类型怎么用吗,包括了你知道JavaScript Symbol类型怎么用吗的使用技巧和注意事项,需要的朋友参考一下 Symbol 类型 根据规范,对象的属性键只能是字符串类型或者 Symbol 类型。不是 Number,也不是 Boolean,只有字符串或 Symbol 这两种类型。 到目前为止,我们只见过字符串。现在我们来看看 Symbol 能

  • 所以我遇到了这个问题,依赖项的AAR元数据(META-INF/com/android/build/gradle/AAR metadata.properties)中指定的minCompileSdk(31)大于该模块的compileSdkVersion(android-30)。 在这里回答:指定的minCompileSdk(31) 我的问题是:我怎么知道是哪个依赖关系导致了这个问题?用户laalto是

  • 我是一个完全的初学者,只构建过基本的Python项目。现在,我正在用bs4用Python构建一个刮板,帮助我阅读网站上的成功故事。这些成功的故事都在一个表中,所以我想我会找到一个html标记,表示table,并将包含整个表。 但是,它只是 我已经看了几个关于如何使用bs4的教程,并且我已经成功地浏览了一些基本的网站,但是我能做的只是获得所有的html,而不是我需要的块(只是成功的故事)。