2017-06-29 7 views
0

以下の関数は、ciscoコマンドの出力を解析し、出力を辞書に格納し、指定されたキーの値を返します。この関数は、ディクショナリに出力が含まれている場合に期待通りに機能します。ただし、辞書の長さがすべて0であるときにコマンドが何も出力しない場合、関数はキーエラーを返します。私は使用したexception KeyError:しかし、これは動作していないようです。Pythonのキーエラーの処理

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' 
+0

あなたは安全な 'get'メソッドを探しています。 'out.get( 'Peer'、None)'を使って試してください。 '.get'の2番目の引数は、あなたが望むデフォルトです。 –

+0

@ kiran.koduruなぜ例外KeyError:が動作していないか知りたい – mike

+0

'out = obj.session_status( 'tunnel0')'行が正常に実行され、dictが生成されました。 'except KeyError'は、' out ['Peer'] 'によって参照されているときではなく、辞書が構築されているときにだけスローされる可能性がありますか? – mjsqu

答えて

0

返却するかを決定するために長さをテストするなどの機能session_status内のテストを、改善します。

が空のdictであるため、out['Peer']を参照すると例外が発生します。 KeyError例外例外が遊びに来ることができる場所を確認するには、これは空の辞書にどのように動作するかです:

out = {} 
status = out['Peer'] 

は、あなたが見ているエラーをスローします。 outでunfoundキーに対処する方法を示しています。

out = {} 
try: 
    status = out['Peer'] 
except KeyError: 
    status = False 
    print('The key you asked for is not here status has been set to False') 

返されるオブジェクトはFalseout['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の結果を扱うことは、必要な値を持たずに進むことであり、 except:ブロック内のブロックsession_statusの機能は現時点では何もしていません。

1

あなたの例外は、適切な場所ではありません。あなたが言ったように、あなたの関数で空の辞書を返すだけです。例外は、返された空のディクショナリオブジェクトのキーを参照しようとしています。status = outertunnel['Peer']。 dict get関数でチェックする方が簡単かもしれません。 status = outertunnel.get('Peer',False)またはこれは、あなたが見ている問題を説明しFalseif len(resultDict) == 0

0

KeyErrorが機能session_statusで起こっていなかったが、それが.soのstatus = out['Peer']であなたのスクリプトの中で起こっているあなたのwork.youは作るべきではないでしょうtry and exceptsession_statustry and exceptstatus = out['Peer']について:

try: 
    status = out['Peer'] 
except KeyError: 
    print 'no Peer' 

か:

status = out.get('Peer', None)