gpt4 book ai didi

python - 如何防止 try catch python中的所有可能行?

转载 作者:IT老高 更新时间:2023-10-28 21:02:56 25 4
gpt4 key购买 nike

我连续有很多行可能会引发异常,但无论如何,它仍应继续下一行。如何在不单独 try catch 每个可能引发异常的语句的情况下执行此操作?

try:
this_may_cause_an_exception()
but_I_still_wanna_run_this()
and_this()
and_also_this()
except Exception, e:
logging.exception('An error maybe occured in one of first occuring functions causing the others not to be executed. Locals: {locals}'.format(locals=locals()))

让我们看看上面的代码,所有的函数都可能抛出异常,但不管它是否抛出异常,它仍然应该执行下一个函数。有什么好的方法吗?

我不想这样做:

try:
this_may_cause_an_exception()
except:
pass
try:
but_I_still_wanna_run_this()
except:
pass
try:
and_this()
except:
pass
try:
and_also_this()
except:
pass

我认为只有当异常很严重时代码才应该在异常之后继续运行(计算机会烧毁或整个系统会搞砸,它应该停止整个程序,但是对于许多小事情也会抛出异常如连接失败等)我通常在异常处理方面没有任何问题,但在这种情况下,我使用的是 3rd 方库,它很容易为小事情引发异常。

查看 m4spy 的答案后,我认为不可能有一个装饰器,即使其中一个引发异常,也可以让函数中的每一行都执行。

这样的东西会很酷:

def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception:
logging.exception('...')
some_special_python_keyword # which causes it to continue executing the next line
return _wrapper

或者是这样的:

def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
for line in func(*args, **kwargs):
try:
exec line
except Exception:
logging.exception('...')
return _wrapper



@silent_log_exceptions
def save_tweets():
a = requests.get('http://twitter.com)
x = parse(a)
bla = x * x

最佳答案

for func in [this_may_cause_an_exception,
but_I_still_wanna_run_this,
and_this,
and_also_this]:
try:
func()
except:
pass

这里有两点需要注意:

  • 您要执行的所有操作都必须由具有相同签名的可调用对象表示(在示例中,不带参数的可调用对象)。如果还没有,请将它们包装在小函数、lambda 表达式、可调用类等中。
  • except 子句是个坏主意,但您可能已经知道了。

另一种更灵活的方法是使用高阶函数,例如

def logging_exceptions(f, *args, **kwargs):
try:
f(*args, **kwargs)
except Exception as e:
print("Houston, we have a problem: {0}".format(e))

关于python - 如何防止 try catch python中的所有可能行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10898873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com