异常处理不会避免错误

时间:2017-03-21 18:43:01

标签: python python-2.7

这是配置文件的片段:

[{u'sequenceNumber': 10, u'text': u'--- 10-999 are broad permits'},
 {u'action': u'permit',
  u'counterData': {},
  u'log': False,
  u'payload': {u'payload': []},
  u'ruleFilter': {u'destination': {u'ip': u'0.0.0.0', u'mask': 0},
                  u'dscp': {u'match': False, u'value': 0},
                  u'dstPort': {u'maxPorts': 10,
                               u'oper': u'any',
                               u'ports': []},
                  u'established': False,
                  u'fragments': False,
                  u'gre': {u'protoMask': 0, u'protocol': 0},
                  u'gtp': {u'teid': 0, u'teidMask': 0},
                  u'icmp': {u'code': 65535, u'type': 65535},
                  u'nvgre': {u'protoMask': 0,
                             u'protocol': 0,
                             u'tni': 0,
                             u'tniMask': 0},
                  u'protocol': 2,
                  u'source': {u'ip': u'0.0.0.0', u'mask': 0},
                  u'srcPort': {u'maxPorts': 10,
                               u'oper': u'any',
                               u'ports': []},
                  u'standard': False,
                  u'tcpFlags': 0,
                  u'tracked': False,
                  u'ttl': {u'oper': u'any', u'value': 0},
                  u'userL4': {u'pattern': 0, u'patternMask': 0},
                  u'vlan': {u'id': 0,
                            u'innerId': 0,
                            u'innerMask': 0,
                            u'mask': 0},
                  u'vxlan': {u'vni': 0, u'vniMask': 0, u'vxlanValid': False}},
  u'sequenceNumber': 20,
  u'text': u'permit igmp any any'},

有问题的代码片段。
因此,我尝试使用KeyErrorNameError处理程序进行循环,因为输入中的所有行都不具有' src_mk'。

的值。
for seq in acl:
    try:
        src_mk = seq['ruleFilter']['source']['mask']
    except (KeyError, NameError):
        pass
    print src_mk

我得到NameError - name not defined。我厌倦了单独处理异常,但它没有工作。

Traceback (most recent call last):
  File "<stdin>", line 6, in <module>
NameError: name 'src_mk' is not defined

1 个答案:

答案 0 :(得分:1)

您需要事先在try-except块之外定义变量。有关您的代码无效的原因,请参阅评论部分@Daniel Roseman's comment

这一行中的某些内容应该有效:

for seq in acl:
    src_mk = None

    try:
        src_mk = seq['ruleFilter']['source']['mask']
    except (KeyError,NameError):
        pass

    print src_mk # Note that if it is None it means there was an exception