在IOError上打开不同的文件

时间:2016-12-14 11:30:58

标签: python python-2.7

我编写了一个python脚本,希望将日志写入/var/log/myapp.log中的文件。但是,在某些平台上,这不存在,或者我们可能没有这样做的许可。在那种情况下,我想尝试在其他地方写作。

def get_logfile_handler():
    log_file_handler = None
    log_paths = ['/var/log/myapp.log', './myapp.log']
    try:
        log_file_handler = logging.FileHandler(log_paths[0])
    except IOError:
        log_file_handler = logging.FileHandler(log_paths[1])

    return log_file_handler

上面的代码可能会起作用,但它似乎远非优雅 - 特别是,尝试使用不同的文件作为异常处理的一部分似乎是错误的。它可能会抛出另一个例外!

理想情况下,它需要一个任意的路径列表而不是两个路径。是否有一种优雅的方式来写这个?

4 个答案:

答案 0 :(得分:1)

你可以简单地使用一个循环,例如:

$charge_id = $result['id'];

HTH

答案 1 :(得分:1)

正如@ PM-2的评论所暗示的那样,没有必要单独引用每条可能的路径。你可以尝试这样的事情:

def getlogfile_handler():
    log_file_handler = None
    log_paths = ('/var/log/myapp.log', './myapp.log') # and more
    for log_path in log_paths:
        try:
            log_file_handler = logging.FileHandler(log_path)
            break
        except IOError:
            continue
    else:
        raise ValueError("No log path available")
    return log_file_handler

else子句处理循环终止但没有找到合适的log_path值的情况。如果循环早期中断(并且只有那时),则执行return语句。

完全可以将异常用于这样的控制流目的 - 案例是例外但它们不是错误 - 当没有找到路径时会发生唯一真正的错误,在这种情况下代码引发它自己的异常,即如果选择的话,来电者可能会抓到。

答案 2 :(得分:0)

def get_logfile_handler():
    log_file_handler = None
    log_paths = ['/var/log/myapp.log', './myapp.log']
    for log_path in log_paths:
        try:
            return logging.FileHandler(log_path)
        except IOError:
            pass

    raise Exception("Cannot open log file!")

这可以解决您的问题。您可以在本地/全局定义,而不是作为参数传递。

答案 3 :(得分:0)

作为一种可能的解决方案,如果您想避免处理异常,可以使用platform模块检查您所在的操作系统,然后选择所需的路径。然后,您可以使用osstat模块来检查权限。

import platform
import os
import stat

...

#the logic goes here

...