Python 3.x Python3尝试例外:哪个解决方案更好,为什么?

Python 3.x Python3尝试例外:哪个解决方案更好,为什么?,python-3.x,try-except,Python 3.x,Try Except,伙计们。 我试图从一个外部yaml配置文件配置日志记录,该文件可能有也可能没有必要的选项,迫使我以几种不同的方式进行检查和故障转移。我写了两个解决方案,做同样的事情,但风格不同: 更传统的“类C”: 和“pythonic”以及内部程序: def setlogstream(stream): if stream == 'console': handler = logging.StreamHandler() handler.set

伙计们。 我试图从一个外部yaml配置文件配置日志记录,该文件可能有也可能没有必要的选项,迫使我以几种不同的方式进行检查和故障转移。我写了两个解决方案,做同样的事情,但风格不同:

更传统的“类C”:

和“pythonic”以及内部程序:

    def setlogstream(stream):
        if stream == 'console':
            handler = logging.StreamHandler()
            handler.setFormatter(logging.Formatter(fmt='scheduler: (%(levelname).1s) %(message)s'))
        elif stream == 'syslog':
            handler = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON, address = '/dev/log')
            handler.setFormatter(logging.Formatter(fmt='scheduler[%(process)d]: (%(levelname).1s) %(message)s'))
        else:
            raise ValueError
        log.addHandler(handler)

    try:
        setlogstream(config['log']['stream'].lower())
    except KeyError:
        print('scheduler: (E) Failed to set log stream: Stream is undefined. Failing over to syslog.', file=sys.stderr)
        setlogstream('syslog')
    except ValueError:
        print('scheduler: (E) Failed to set log stream: Unknown stream: \'' + config['log']['stream'] + '\'. Failing over to syslog.', file=sys.stderr)
        setlogstream('syslog')
它们都做我需要的事情,都很短,都可以扩展,以防我需要更多的流,但现在我想知道哪一个更好,为什么?

说一个更好主要是个人偏好的问题;如果它完成了它需要的任务,那么选择你喜欢的方式。也就是说,我认为应该使用第二个,原因如下:

  • 定义
    setlogstream()
    都可以明确代码的这一部分的作用,并允许您在需要时稍后再次使用它
  • 使用单独的except案例可以使代码更具可读性,更易于理解。如果在处理第一个错误时出现另一个错误,这可能特别有用

  • 总的来说,第二个解决方案更具可读性,您未来的自我将感谢您这样写。

    我更喜欢第二个解决方案,因为您已经将流的逻辑和错误处理分离了。作为一名外部用户(或您未来的自己),我现在非常清楚
    setlogstream
    的作用,以及错误处理的位置。在您的第一个示例中,我必须理解
    try
    正文中的代码,除了
    正文和
    最后
    正文之外的
    ,以便查看正在设置的流。
    
        def setlogstream(stream):
            if stream == 'console':
                handler = logging.StreamHandler()
                handler.setFormatter(logging.Formatter(fmt='scheduler: (%(levelname).1s) %(message)s'))
            elif stream == 'syslog':
                handler = logging.handlers.SysLogHandler(facility=logging.handlers.SysLogHandler.LOG_DAEMON, address = '/dev/log')
                handler.setFormatter(logging.Formatter(fmt='scheduler[%(process)d]: (%(levelname).1s) %(message)s'))
            else:
                raise ValueError
            log.addHandler(handler)
    
        try:
            setlogstream(config['log']['stream'].lower())
        except KeyError:
            print('scheduler: (E) Failed to set log stream: Stream is undefined. Failing over to syslog.', file=sys.stderr)
            setlogstream('syslog')
        except ValueError:
            print('scheduler: (E) Failed to set log stream: Unknown stream: \'' + config['log']['stream'] + '\'. Failing over to syslog.', file=sys.stderr)
            setlogstream('syslog')