some_function()
在执行过程中引发了异常,因此程序跳转到except
块:
try:
some_function()
except:
print("exception happened!")
我该如何查看导致异常的原因?
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
raise
语句结束 except 块,可以通过透明地重新引发被捕获的异常来解决问题。except:
的区别在于:
except:
不会给出可检查的异常对象。SystemExit
、KeyboardInterrupt
和 GeneratorExit
不会被上述代码捕获,这通常是你想要的。请参见 exception hierarchy。import traceback
print traceback.format_exc()
logging
模块,可以像这样将异常(以及消息)打印到日志中:import logging
log = logging.getLogger()
log.exception("Message for you, sir!")
pdb
模块的 post_mortem
函数:import pdb
pdb.post_mortem()
objc.error
异常类型,这种异常有点奇怪。 - jxramos获取异常对象所属类的名称:
e.__class__.__name__
使用print_exc()函数还会打印堆栈跟踪信息,这是任何错误消息中必要的信息。
像这样:
from traceback import print_exc
class CustomException(Exception): pass
try:
raise CustomException("hi")
except Exception as e:
print ('type is:', e.__class__.__name__)
print_exc()
# print("exception happened!")
您将会得到如下输出:type is: CustomException
Traceback (most recent call last):
File "exc.py", line 7, in <module>
raise CustomException("hi")
CustomException: hi
在打印和分析后,代码可以决定不处理异常并执行raise
:
from traceback import print_exc
class CustomException(Exception): pass
def calculate():
raise CustomException("hi")
try:
calculate()
except CustomException as e:
# here do some extra steps in case of CustomException
print('custom logic doing cleanup and more')
# then re raise same exception
raise
输出:
custom logic doing cleanup and more
解释器输出异常:
Traceback (most recent call last):
File "test.py", line 9, in <module>
calculate()
File "test.py", line 6, in calculate
raise CustomException("hi")
__main__.CustomException: hi
使用raise
语句引发异常会导致原始异常继续向上调用堆栈传播。(注意可能的陷阱)如果引发新的异常,则将携带新的(较短的)堆栈跟踪。
from traceback import print_exc
class CustomException(Exception):
def __init__(self, ok):
self.ok = ok
def calculate():
raise CustomException(False)
try:
calculate()
except CustomException as e:
if not e.ok:
# Always use `raise` to rethrow exception
# following is usually mistake, but here we want to stress this point
raise CustomException(e.ok)
print("handling exception")
输出:
Traceback (most recent call last):
File "test.py", line 13, in <module>
raise CustomException(e.message)
__main__.CustomException: hi
注意,回溯信息中并没有包含来自第9
行的calculate()
函数,而这个函数是导致原始异常e
的根源。
e.__class__.__name__
和上面的答案建议的type(e).__name__
是一样的吗? - information_interchangeexcept CustomException
,不要之后再进行类型检查。 - DSchmidtif e.__class__ == CustomException
而不是更简洁的except CustomException
。 - DSchmidt通常,您不应使用 try: ... except
来捕获所有可能的异常,因为这样过于宽泛。只捕获那些由于某种原因预计会发生的异常即可。如果您确实必须这样做,例如在调试时想要了解有关某个问题的更多信息,那么应该采取以下措施:
try:
...
except Exception as ex:
print ex # do whatever you want for debugging.
raise # re-raise exception.
smtplib
发送电子邮件时捕获可能引发的所有异常吗? - linusgexcept (…) as (…):
语法(确实如此),但同时没有人想谈论房间里的大象,该大象就是sys.exc_info()
函数。
来自sys模块的文档(强调是我的):
我认为该函数返回一个三元组,其中包含有关当前正在处理的异常的信息。
(…)
如果堆栈上没有任何地方正在处理异常,则返回一个包含三个None值的元组。否则,返回的值为(type,value,traceback)。它们的含义是: type获取正在处理的异常的类型 (BaseException子类); value获取异常实例(异常类型的实例);traceback获取一个追溯对象(请参见参考手册),该对象封装了最初出现异常的调用堆栈。
sys.exc_info()
可以被视为对最初问题的直接答案:“我怎样才能知道发生了什么类型的异常?”except
。只是为了完整起见,exctype, value = sys.exc_info()[:2]
将告诉您异常类型,然后可以在 except
中使用它。 - Ondrej Burkertisinstance(e, SomeException)
很方便,因为它也可以测试 SomeException
的子类,这样你就能够创建适用于异常层次结构的功能。除非somefunction
是一个非常糟糕的遗留函数,否则您不应该需要您所要求的内容。
使用多个except
子句以不同方式处理不同的异常:
try:
someFunction()
except ValueError:
# do something
except ZeroDivision:
# do something else
重点是不要捕获通用的异常,只需要捕获需要的异常。我相信您不希望掩盖意外错误或漏洞。
except Exception, exc:
# This is how you get the type
excType = exc.__class__.__name__
# Here we are printing out information about the Exception
print 'exception type', excType
print 'exception msg', str(exc)
# It's easy to reraise an exception with more information added to it
msg = 'there was a problem with someFunction'
raise Exception(msg + 'because of %s: %s' % (excType, exc))
exc.__class__.__name__
已经在Alex的答案中提到了,建议使用-1。- https://dev59.com/8mkw5IYBdhLWcg3wirCs#9824060 - Piotr Dobrogosttype
类和 as
语句。try:#code
except Exception as e:
m=type(e)
#m is the class of the exception
strm=str(m)
#strm is the string of m
希望这能再帮上一点忙。
import sys
varExcepHandling, varExcepHandlingZer = 2, 0
try:
print(varExcepHandling/varExcepHandlingZer)
except Exception as ex:
print(sys.exc_info())
sys.exc_info()
'会返回一个元组,如果你只想要异常类名,可以使用'sys.exc_info()[0]
'dir(__builtin__)
。path = 'app.p'
def load():
if os.path.exists(path):
try:
with open(path, 'rb') as file:
data = file.read()
inst = pickle.load(data)
except Exception as e:
inst = solve(e, 'load app data', easy=lambda: App(), path=path)()
else:
inst = App()
inst.loadWidgets()
# e.g. A solver could search for app data if desc='load app data'
def solve(e, during, easy, **kwargs):
class_name = e.__class__.__name__
print(class_name + ': ' + str(e))
print('\t during: ' + during)
return easy
目前,由于我不想与我的应用程序目的有关联地思考,所以我没有添加任何复杂的解决方案。但是,在未来,当我更多地了解可能的解决方案(因为应用程序的设计更多)时,我可以添加一个按during
索引的解决方案字典。
在所示示例中,一种解决方案可能是查找存储在其他地方的应用程序数据,例如如果错误删除了“app.p”文件。
目前,编写异常处理程序并不是一个明智的想法(我们还不知道最好的解决方法,因为应用程序设计将会发展),我们只需返回简单的修复方式,就像我们第一次运行应用程序一样(在这种情况下)。
except:
(没有裸的raise
),除非在整个程序中只有一次,最好也不要使用。请注意,此处的“裸”指的是未指定异常类型的情况。 - Mike Grahamexcept
子句,则无需检查异常类型,这通常是根据特定的异常类型采取相应措施的做法。 - Rik Poggiexcept
块内,可以通过sys.exc_info()
函数获取异常信息 – 该函数返回一个包含当前处理的异常相关信息的三元组。 - Piotr Dobrogostexcept __ as e
。也就是说,我该如何获取类/类型以便捕获它?顺便提一下,我正在使用Databricks,所以当我尝试打印type(e)
时,我看到的是:<class 'dbutils.DBUtils.FSHandler.prettify_exception_message.<locals>.f_with_exception_handling.<locals>.ExecutionError'>。 - information_interchange