处理 python 中的键错误
Handling key error in python
以下函数解析 cisco 命令输出,将输出存储在字典中,returns 给定键的值。当字典包含输出时,此函数按预期工作。但是,如果命令 returns 根本没有输出字典的长度为 0 并且函数 returns 出现键错误。我用过 exception KeyError:
但这似乎不起作用。
from qa.ssh import Ssh
import re
class crypto:
def __init__(self, username, ip, password, machinetype):
self.user_name = username
self.ip_address = ip
self.pass_word = password
self.machine_type = machinetype
self.router_ssh = Ssh(ip=self.ip_address,
user=self.user_name,
password=self.pass_word,
machine_type=self.machine_type
)
def session_status(self, interface):
command = 'show crypto session interface '+interface
result = self.router_ssh.cmd(command)
try:
resultDict = dict(map(str.strip, line.split(':', 1))
for line in result.split('\n') if ':' in line)
return resultDict
except KeyError:
return False
测试脚本:
obj = crypto('uname', 'ipaddr', 'password', 'router')
out = obj.session_status('tunnel0')
status = out['Peer']
print(status)
错误
Traceback (most recent call last):
File "./test_parser.py", line 16, in <module>
status = out['Peer']
KeyError: 'Peer'
您的例外情况不在正确的位置。正如您所说,您只是 return 一个包含您的函数的空字典。异常是试图在 returned status = outertunnel['Peer']
的空字典对象上查找键。使用 dict get 函数检查它可能更容易。 status = outertunnel.get('Peer',False)
或者改进函数内的测试session_status,比如测试长度决定什么returnFalse
if len(resultDict) == 0
这解释了您遇到的问题。
当您引用 out['Peer']
时会发生异常,因为 out
是一个空字典。要查看 KeyError 异常可以发挥作用的地方,这是它对空字典的操作方式:
out = {}
status = out['Peer']
抛出您看到的错误。下面展示了如何处理 out
:
中未找到的密钥
out = {}
try:
status = out['Peer']
except KeyError:
status = False
print('The key you asked for is not here status has been set to False')
即使返回的对象是 False
,out['Peer']
仍然失败:
>>> out = False
>>> out['Peer']
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
out['Peer']
TypeError: 'bool' object is not subscriptable
我不确定你应该如何进行,但是处理 session_status
没有你需要的值的结果是前进的方向,try:
except:
块session_status
函数内部目前没有做任何事情。
KeyError
没有发生在函数 session_status
中,它发生在你的脚本中 status = out['Peer']
。所以你的 try and except
在 session_status
会not work.you 应该为 status = out['Peer']
:
创建一个 try and except
try:
status = out['Peer']
except KeyError:
print 'no Peer'
或:
status = out.get('Peer', None)
以下函数解析 cisco 命令输出,将输出存储在字典中,returns 给定键的值。当字典包含输出时,此函数按预期工作。但是,如果命令 returns 根本没有输出字典的长度为 0 并且函数 returns 出现键错误。我用过 exception KeyError:
但这似乎不起作用。
from qa.ssh import Ssh
import re
class crypto:
def __init__(self, username, ip, password, machinetype):
self.user_name = username
self.ip_address = ip
self.pass_word = password
self.machine_type = machinetype
self.router_ssh = Ssh(ip=self.ip_address,
user=self.user_name,
password=self.pass_word,
machine_type=self.machine_type
)
def session_status(self, interface):
command = 'show crypto session interface '+interface
result = self.router_ssh.cmd(command)
try:
resultDict = dict(map(str.strip, line.split(':', 1))
for line in result.split('\n') if ':' in line)
return resultDict
except KeyError:
return False
测试脚本:
obj = crypto('uname', 'ipaddr', 'password', 'router')
out = obj.session_status('tunnel0')
status = out['Peer']
print(status)
错误
Traceback (most recent call last):
File "./test_parser.py", line 16, in <module>
status = out['Peer']
KeyError: 'Peer'
您的例外情况不在正确的位置。正如您所说,您只是 return 一个包含您的函数的空字典。异常是试图在 returned status = outertunnel['Peer']
的空字典对象上查找键。使用 dict get 函数检查它可能更容易。 status = outertunnel.get('Peer',False)
或者改进函数内的测试session_status,比如测试长度决定什么returnFalse
if len(resultDict) == 0
这解释了您遇到的问题。
当您引用 out['Peer']
时会发生异常,因为 out
是一个空字典。要查看 KeyError 异常可以发挥作用的地方,这是它对空字典的操作方式:
out = {}
status = out['Peer']
抛出您看到的错误。下面展示了如何处理 out
:
out = {}
try:
status = out['Peer']
except KeyError:
status = False
print('The key you asked for is not here status has been set to False')
即使返回的对象是 False
,out['Peer']
仍然失败:
>>> out = False
>>> out['Peer']
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
out['Peer']
TypeError: 'bool' object is not subscriptable
我不确定你应该如何进行,但是处理 session_status
没有你需要的值的结果是前进的方向,try:
except:
块session_status
函数内部目前没有做任何事情。
KeyError
没有发生在函数 session_status
中,它发生在你的脚本中 status = out['Peer']
。所以你的 try and except
在 session_status
会not work.you 应该为 status = out['Peer']
:
try and except
try:
status = out['Peer']
except KeyError:
print 'no Peer'
或:
status = out.get('Peer', None)