清理嵌套的Try/Excepts

Pau*_*lan 4 python

我刚刚写了一大堆代码,这些代码让我觉得它比最优化的嵌套要多得多.我想了解如何改进这种风格的建议,尤其是它更符合"Flat比嵌套更好".

for app in apps:
    if app.split('.', 1)[0] == 'zc': #only look for cron in zc apps
        try:
            a = app + '.cron'
            __import__(a)
            m = sys.modules[a]

            try:
                min = m.cron_minute()
                for job in min:
                    k.add_interval_task(job[0], 'minute task', r(M_LB, M_UB),
                                        60*job[1], 
                                        kronos.method.threaded, (), ())
            except AttributeError: #no minute tasks
                pass

            try:
                hour = m.cron_hour()
                for job in hour:
                    k.add_daytime_task(job[0], 'day task', range(1, 8), None,
                                       (job[1], r(H_LB, H_UB)), 
                                       kronos.method.threaded, (), ())
            except AttributeError: #no hour tasks
                pass

        except ImportError: #no cron jobs for this module
            pass
Run Code Online (Sandbox Code Playgroud)

编辑: 结合下面的建议,这是我的改写形式.

for app in apps:
    if app.split('.', 1)[0] != 'zc': #only look for cron in zc apps
        continue

    try:
        a = app + '.cron'
        __import__(a)
    except ImportError: #no cron jobs for this module, continue to next one
        continue

    m = sys.modules[a]
    if hasattr(m, 'cron_minute'):
        min = m.cron_minute()
        for job in min:
            k.add_interval_task(job[0], 'minute task', r(M_LB, M_UB),
                                60*job[1], 
                                kronos.method.threaded, (), ())

    if hasattr(m, 'cron_hour'):
        hour = m.cron_hour()
        for job in hour:
            k.add_daytime_task(job[0], 'day task', range(1, 8), None,
                               (job[1], r(H_LB, H_UB)), 
                               kronos.method.threaded, (), ())
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 8

主要的问题是你的尝试条款过于宽泛,特别是最外层的条款:有了这种习惯,你迟早会遇到一个神秘的错误,因为你的一个尝试/除了意外地隐藏了一个意外的异常"冒泡"来自你正在打电话的其他一些功能.

所以我建议,相反:

for app in apps:
    if app.split('.', 1)[0] != 'zc': #only look for cron in zc apps
        continue

    try:
        a = app + '.cron'
        __import__(a)
    except ImportError: #no cron jobs for this module
        continue

    # etc etc
Run Code Online (Sandbox Code Playgroud)

顺便说一下,我也用另一种方式应用"扁平比嵌套更好"(不依赖于任何尝试/除外),"如果我在循环的这一段没有更多的事情要做,继续[即继续前进]到循环的下一个循环]而不是"如果我有事情要做:"后面跟着大量嵌套代码.我总是喜欢这种样式(if/continue或if/return)嵌套if语言提供功能,如continue(基本上所有现代的,因为C有它;-).

但这是一个简单的"扁平与嵌套"风格偏好,问题的关键在于:保持你的试用条款小!最糟糕的情况是,当你不能简单地继续或在except子句中返回时,你可以使用try/except/else:在try子句中只放入绝对必须存在的东西 - 可能和预期的一小段代码raise - 并在else子句中放入以下代码的其余部分(不应该也不应该引发的部分).这不会改变嵌套,但是在降低意外隐藏不期望的异常的风险方面做了很大的改变!