python - Python 中的日志记录和异常
问题描述
我目前正在编写我的第一个更大的脚本,它是一个基于控制台的 GUI,用户通过输入数字来选择选项来启动几个任务:
我最近实现了很多错误处理,以防止在后台出现问题时关闭窗口。我有点困惑我的方法是否正确。
我的代码的基本结构如下:
有一个函数read_excel()
可以用 pandas 加载一些 Excel 文件:
def read_excel(excel_path):
try:
df = pd.read_excel(excel_path, encoding="utf-8")
except FileNotFoundError:
raise FileNotFoundError('Unable to load assignment file, maybe choose custom')
return
# do stuff....
if not all(len(x) == len(signalnames) for x in [frequencies, cans]):
raise ValueError('Frequency and can number must be given for every signal in assignment file!')
else:
logging.info("Successfully loaded assignment file")
return signalnames, frequencies, group_names, cans, can_paths
ft_14()
然后在 GUI 调用的函数中将此函数与其他函数一起使用:
def ft_14(files, draft assignement_path):
try:
signalnames, frequencies, group_names, cans, can_paths = read_excel(assignement_path)
except (ValueError, FileNotFoundError) as e:
logging.error(e)
return
# do stuff..
try:
wb.save(os.path.join(os.path.dirname(files[0]), "FT.14_results.xlsx"))
wb.close()
except Exception:
logging.error('Unable to save report excel')
所以我的尝试是在后端引发异常,然后在由 GUI 调用的函数中排除它们,并使用日志记录为用户显示它们。所以我的问题是这种方法是否是使用异常和一起记录的正确方法,或者是否有更聪明的方法,因为调用:
try:
# some function()
except Exection as e:
logging.error(e)
我觉得不对。
解决方案
您最后发布的代码让您感到不舒服,它是正确的,因为它按照它所说的去做。如果有异常,它会记录错误。
令人担忧的是它也处理异常。在许多情况下,您不想更改异常处理过程中的任何其他内容——您只想记录并让异常正常传播。
https://docs.python.org/3/tutorial/errors.html#raising-exceptions
import logging
logger = logging.getLogger(__name__)
def fn(x):
try:
return x / 0
except Exception as e:
logger.error(str(e))
raise e
print ("let's do something risky")
try:
fn(20)
except Exception as e:
pass
print ("it has been done")
请注意 fn(x) 如何检测和处理异常,然后重新引发它们,就好像它根本没有对异常做任何事情一样?你用“raise”而不是争论来做到这一点。
在您的第一个代码示例中,您捕获了一个异常,然后引发了一个完全不同的异常,它恰好属于同一类型:
except FileNotFoundError:
raise FileNotFoundError('Unable to load assignment file, maybe choose custom')
如果您想隐藏信息,这可能是公平的游戏,例如,如果异常具有您不想暴露给外部的内部细节。但是您不知道通过用新实例完全替换异常会丢失什么信息。但这些都不是“正确”或“错误”,它们只是您对如何处理异常做出的选择。(编辑:最好最终处理它们或记录它可以抛出的东西,但我们离题了)
对于记录器来说,这些都不重要。你本可以在那里记录并重新加注。您可以记录原始异常,然后提升经过清理的版本。您可以在那里处理它,记录它,而不是提高(如您发布的示例)。记录器不在乎你对异常做了什么。如果要记录,请立即记录。
推荐阅读
- database - 图数据库中的数据组织
- python - 使用python中的漂亮汤从xml文件中提取特定标签
- r - 在数据框中使用不同因子的相关散点图
- spring - FileNotFoundException:类路径资源 [FileChangeListener.class] 无法打开,因为它不存在
- java - Xamarin.Forms 预览屏幕不工作
- django - Django在反向排序后复制对象
- airflow - 当我们有更多的 dag 文件时,会跳过气流运行
- c++ - OpenCV C++ 使用 cv::UMat 而不是 cv:Mat 和指针
- xamarin.forms - 点击后 MVVMCross 非活动页面
- scrapy - scrapy splash 截取整个页面的屏幕截图