python - 如果我想捕获并记录(不引发)异常,KeyboardInterrupt 应该是唯一引发的异常吗?
问题描述
在异常的情况下,我希望程序捕获它们,记录它们,然后继续下一次迭代。显然,仍然应该引发 KeyboardInterrupt 以便可以停止程序,但是我应该引发任何其他异常吗?
下面是非常粗略的代码示例。这是一个装饰器,它捕获异常并记录它们。基本上,我应该有其他except
情况吗?
def exception_logger(func):
@wraps(func)
def wrapper(*args, **kwargs):
# Run as normal
try:
return func(*args, **kwargs)
except KeyboardInterrupt:
raise
# Any other exception that occurs is logged
except:
log_file = 'example.txt'
logger = logger_format(log_file)
logger.exception(f'\nAn exception occurred with: {func.__qualname__}\n')
print(f'\n\nAn exception occurred with: {func.__qualname__}\nView the log file for details.\n'.upper())
return wrapper
谢谢。
解决方案
而不是黑名单(可能会老化),你应该只是捕捉Exception
而不是使用except:
. 它排除KeyboardInterrupt
了你不应该压制的各种其他人。(记录它们可能没问题,但无论如何您似乎都不想这样做。)另请参阅关于上下文的特别反对建议。except: pass
推荐阅读
- hybris - Hybris中字符串的下拉组件
- java - 线程“主”java.lang.IllegalArgumentException 中的异常:java.lang.Object 不是索引实体或索引实体的子类
- neo4j - 获得多个总和的最大值
- django - 从默认响应返回自定义有效负载
- python - Django 模型:ValueError:缺少“file_name.ext”的静态文件清单条目
- c# - 如何在 WPF (C#) 中子类化 Canvas 并通过 XAML 将其添加到主窗口?
- image - 如何使用 Keras ImageDataGenerator 让我的 X_rotated
- docker - 如何在 Docker 容器中运行的 Prometheus 中持久化数据?
- .net-core - 终止 .NET Core 的先前部署过程
- survival-analysis - Tobit生存模型中的预测