【问题标题】:Python 3 try-except: which solution is better and why?Python 3 try-except:哪种解决方案更好,为什么?
【发布时间】:2021-04-07 23:42:25
【问题描述】:

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

更传统的“C-like”:

    try:
        if config['log']['stream'].lower() == 'console':
            handler = logging.StreamHandler()
            handler.setFormatter(logging.Formatter(fmt='scheduler: (%(levelname).1s) %(message)s'))
        elif config['log']['stream'].lower() == 'syslog':
            raise ValueError
        else:
            print('scheduler: (E) Failed to set log stream: Unknown stream: \'' + config['log']['stream'] + '\'. Failing over to syslog.', file=sys.stderr)
            raise ValueError
    except (KeyError, ValueError) as e:
        if type(e) == KeyError:
            print('scheduler: (E) Failed to set log stream: Stream is undefined. Failing over to syslog.', file=sys.stderr)
        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'))
    finally:
        log.addHandler(handler)

以及带有内部程序的“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 做了什么,以及错误处理在哪里。在您的第一个示例中,我必须了解 try 正文、except 正文和 finally 正文中的代码,才能查看正在设置的流。

标签: python-3.x try-except


【解决方案1】:

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

  1. 定义setlogstream()都可以清楚地说明您的代码的该部分的作用,并允许您稍后在需要时再次使用它。
  2. 使用单独的except 案例使您的代码更具可读性和易于理解。如果在处理第一个错误时不知何故发生了另一个错误,这可能特别有用。

总的来说,第二个更易读,你未来的自己会感谢你这样写的。

【讨论】:

    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多