我如何编写一个try
/ except
块来捕获所有异常?
sys.stderr
并可能记录在何处之外,很难想到此方法还适合什么其他地方。这是完全有效且常见的例外。
try: whatever() except Exception as e: exp_capture()
?
我如何编写一个try
/ except
块来捕获所有异常?
sys.stderr
并可能记录在何处之外,很难想到此方法还适合什么其他地方。这是完全有效且常见的例外。
try: whatever() except Exception as e: exp_capture()
?
Answers:
您可以,但您可能不应该:
try:
do_something()
except:
print "Caught it!"
但是,这也会捕获类似的异常KeyboardInterrupt
,您通常不希望那样,对吗?除非您立即重新引发异常-参见docs中的以下示例:
try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except IOError as (errno, strerror):
print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
print "Could not convert data to an integer."
except:
print "Unexpected error:", sys.exc_info()[0]
raise
except Exception:
裸露的地方,除非那里也将捕获BaseException。
除了裸露的except:
子句(就像其他人说的那样,您不应该使用),您可以简单地捕获Exception
:
import traceback
import logging
try:
whatever()
except Exception as e:
logging.error(traceback.format_exc())
# Logs the error appropriately.
通常,仅当您想在终止之前处理任何其他未捕获的异常时,才通常考虑在代码的最外层执行此操作。
的优势,except Exception
在裸露的except
是,有少数例外,它不会赶上,最明显KeyboardInterrupt
和SystemExit
:如果你抓住了,吞下这些,那么你可以让任何人都很难离开你的脚本。
Exception
。请注意,不可能引发int
异常,而尝试引发TypeError
异常会引发异常,except Exception
在这种情况下,这就是封闭子句所捕获的异常。在另一方面,老式的类可以提出并鉴定为不子类“非例外” Exception
-这将通过裸捕获except
子句,但不是由except Exception
子句。
TypeError
sys.exit()
通常意味着您希望该应用程序终止,但是如果您捕获SystemExit,它将不会终止。同样,如果您在正在运行的脚本上按Control-C(在Windows上为Ctrl-break),则您希望程序停止运行,而不是捕获错误并继续运行。但是,如果您想在存在之前进行清理,则可以捕获其中的一个或两个。
您可以执行此操作以处理一般异常
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
要捕获所有可能的异常,请捕获BaseException
。它位于Exception层次结构的顶部:
Python 3:https: //docs.python.org/3.5/library/exceptions.html#exception-hierarchy
Python 2.7:https: //docs.python.org/2.7/library/exceptions.html#exception-hierarchy
try:
something()
except BaseException as error:
print('An exception occurred: {}'.format(error))
但是,正如其他人所提到的那样,通常仅在特定情况下才需要此功能。
非常简单的示例,类似于此处找到的示例:
http://docs.python.org/tutorial/errors.html#defining-clean-up-actions
如果您尝试捕获所有异常,则将所有代码放在“ try:”语句中,代替“ print”执行可能会引发异常的操作。”。
try:
print "Performing an action which may throw an exception."
except Exception, error:
print "An exception was thrown!"
print str(error)
else:
print "Everything looks great!"
finally:
print "Finally is called directly after executing the try statement whether an exception is thrown or not."
在上面的示例中,您将按以下顺序查看输出:
1)执行可能会引发异常的动作。
2)无论是否引发异常,在执行try语句后直接调用final。
3)“引发了异常!” 或“一切看起来都很棒!” 取决于是否引发异常。
希望这可以帮助!
有多种方法可以做到这一点,特别是在Python 3.0及更高版本中
方法1
这是简单的方法,但不建议使用,因为您不知道确切的代码行实际引发异常:
def bad_method():
try:
sqrt = 0**-1
except Exception as e:
print(e)
bad_method()
方法2
建议使用此方法,因为它提供了有关每个异常的更多详细信息。这包括:
唯一的缺点是需要导入tracback。
import traceback
def bad_method():
try:
sqrt = 0**-1
except Exception:
print(traceback.print_exc())
bad_method()
try:
whatever()
except:
# this will catch any exception or error
值得一提的是,这不是正确的Python编码。这还将捕获许多您可能不想捕获的错误。