提问人:user469652 提问时间:2/14/2011 最后编辑:Charlie Parkeruser469652 更新时间:5/29/2023 访问量:1137899
如何编写捕获所有异常的“try”/“except”块?
How can I write a `try`/`except` block that catches all exceptions?
答:
try:
whatever()
except:
# this will catch any exception or error
值得一提的是,这不是正确的 Python 编码。这还将捕获许多您可能不想捕获的错误。
评论
你可以,但你可能不应该:
try:
do_something()
except:
print("Caught it!")
但是,这也将捕获异常,例如您通常不希望那样,是吗?除非您立即重新引发异常 - 请参阅文档中的以下示例:KeyboardInterrupt
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:
除了一个裸露的子句(正如其他人所说,你不应该使用它),你可以简单地抓住 Exception
:except:
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()
except BaseException as e: notify_user(e); raise
非常简单的示例,类似于此处的示例:
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语句后直接调用。
3)“抛出异常!”或“一切看起来都很棒!”,这取决于是否抛出异常。
希望这有帮助!
评论
except:
e
except Exception as error:
您可以这样做来处理常规异常
try:
a = 2/0
except Exception as e:
print e.__doc__
print e.message
评论
message
要捕获所有可能的异常,请捕获 .它位于 Exception 类层次结构的顶部:BaseException
Python 3:https://docs.python.org/3.11/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))
但正如其他人所提到的,您通常不需要这个,只有在非常特殊的情况下才需要它。
评论
except:
e
In Python, all exceptions must be instances of a class that derives from BaseException
,但如果你可以在一般情况下省略它 - 省略它,问题是,关于它的酒。
SIGINT
KeyboardInterrupt
KeyboardInterrupt
BaseException
Exception
我刚刚发现了这个小技巧,用于在 Python 2.7 中测试异常名称。有时我在代码中处理了特定的异常,所以我需要一个测试来查看该名称是否在已处理的异常列表中。
try:
raise IndexError #as test error
except Exception as e:
excepName = type(e).__name__ # returns the name of the exception
评论
except:
e
有多种方法可以做到这一点,特别是使用 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()
评论
except:
e
traceback.print_exc()
我正在添加奖励方法,该方法可以捕获具有完整回溯的异常,这可以帮助您更多地了解错误。
Python 3
import traceback
try:
# your code goes here
except Exception as e:
print(e)
traceback.print_exc()
评论
首先,有些异常是你希望它们破坏你的代码的(因为当这个错误发生时,你的代码无论如何都不会起作用!),还有一些异常是你想静默/平滑地捕获的。尝试区分它们。您可能不想捕获所有异常!
其次,您可以花时间浏览流程日志,而不是捕获所有内容。假设您收到其他/第三方异常,例如来自 GCP 等云服务提供商的异常。在日志中,您可以找到您得到的异常。然后,你可以做这样的事情:
from google.api_core.exceptions import ServiceUnavailable, RetryError
for i in range(10):
try:
print("do something")
except ValueError:
print("I know this might happen for now at times! skipping this and continuing with my loop"
except ServiceUnavailable:
print("our connection to a service (e.g. logging) of gcp has failed")
print("initializing the cloud logger again and try continuing ...")
except RetryError:
print("gcp connection retry failed. breaking the loop. try again later!)
break
对于其余的(可能发生或可能不会发生的错误),如果我遇到意外异常,我会为我的代码崩溃留出空间!这样,我就可以了解正在发生的事情,并通过捕获边缘情况来改进我的代码。
如果您希望它永远不会因为某种原因而崩溃,例如,如果它是嵌入在远程硬件中的代码,您不容易访问,您可以在末尾添加一个通用的异常捕获器:
except Exception as e:
print(f"something went wrong! - {e}")
您还可以在此处查看 Python 3 异常层次结构。和 的区别在于,不会抓住 、 或Exception
BaseException
Exception
SystemExit
KeyboardInterrupt
GeneratorExit
评论
sys.stderr
try: whatever() except Exception as e: exp_capture()
except: pass
是一种糟糕的编程实践?