Python中的日志记录和异常

时间:2020-09-14 08:45:01

标签: python exception logging

我目前正在编写第一个较大的脚本,它是一个基于控制台的GUI,用户可以通过输入数字来启动多个任务来选择选项:

See this example screenshot.

我最近实现了很多错误处理,以防止在后台出现问题时关闭窗口。我有点困惑我的方法是否正确。

我的代码的基本结构如下:

有一个功能read_excel(),该功能可以通过熊猫加载一些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

此功能随后与GUI调用的功能ft_14()中的其他功能一起使用:

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)

我觉得不对。

1 个答案:

答案 0 :(得分:0)

您在最后发布的代码使您感到不舒服,它是正确的,因为它可以执行其将要执行的操作。如果有异常,它将记录错误。

担心的是它也处理异常。在许多情况下,您不想在异常处理过程中进行任何其他更改,您只想记录日志并让异常正常传播。

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')

如果您想隐藏信息,例如,如果异常具有您不想暴露给外部的内部细节,那么这可能是公平的游戏。但是您不知道通过用新实例完全替换异常而丢失了什么信息。但是,这些都不是“正确”或“错误”的,它们只是您如何处理异常的选择。 (编辑:最好是最终处理它们或记录可能抛出的东西,但这是个好主意)

与记录器无关。您可能已经将其记录在此处并重新引发。您可以记录原始异常,然后引发经过清理的版本。您可以在那里进行处理,记录日志,而不必加薪(如您发布的示例)。记录器不在乎您对异常的处理方式。如果要记录下来,请立即记录。

相关问题