骚年 运维少年
运维少年系列 python and cisco (3)异常处理什么是异常处理?异常处理通常来说是对程序在执行时(非编译时)出现的各种报错进行处理,如果没有异常处理,那么在程序出错的时候,整个程序会立即退出,而做了异常处理之后,程序会根据异常定义的方式进行错误处理。
通俗来讲:如果没有异常处理,那程序出错的时候就GG了
系列文章常见的异常这个系列的文章常见的异常有哪些呢?
连接失败连接失败的原因有很多种,比如网络不通啦、端口没开啦…
连接失败抛出的异常如下
1[root@yunwei cisco]# python ywsn_p_c_lab3.py 2Traceback (most recent call last):3 file "ywsn_p_c_lab3.py", line 9, in <module>4 s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False)5 file "/usr/lib/python2.7/site-packages/paramiko/clIEnt.py", line 362, in connect6 raise NovalIDConnectionsError(errors)7paramiko.ssh_exception.NovalIDConnectionsError: [Errno None] Unable to connect to port 22 on 192.168.200.28[root@yunwei cisco]#
做异常处理的时候,我们需要关注的是什么呢?就是异常抛出的代码,比如这里的paramiko.ssh_exception.NovalIDConnectionsError
如何做异常处理?在python中异常处理使用try:... expect...,如
1import paramiko 2import time 3user = 'yunwsn' 4passwd = '123456' 5s = paramiko.SSHClIEnt() 6s.set_missing_host_key_policy(paramiko.autoAddPolicy()) 7IP = file('IP.txt','rb') 8 9for ip in IP.xreadlines():10 try: # 异常处理以下内容11 s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False) # 如果这里出现异常,那么直接到execpt代码块中去了,不会打印下面的成功12 print '[ 3[0;32m success3[0m ] login %s ' %ip1314 except paramiko.ssh_exception.NovalIDConnectionsError:15 print '[ 3[0;32m Failed 3[0m ] Unable to connect to %s ' % ip161718IP.close()
运行一下(动图)
socket超时异常如下,有时候由于网络质量不好或者IP不存在,导致socket连接超时(任何连接都是基于socket的),出现以下异常
1Traceback (most recent call last): 2 file "ywsn_p_c_lab3.py", line 11, in <module> 3 s.connect(ip,username=user,password=passwd,look_for_keys=False,allow_agent=False) 4 file "/usr/lib/python2.7/site-packages/paramiko/clIEnt.py", line 343, in connect 5 retry_on_signal(lambda: sock.connect(addr)) 6 file "/usr/lib/python2.7/site-packages/paramiko/util.py", line 280, in retry_on_signal 7 return function() 8 file "/usr/lib/python2.7/site-packages/paramiko/clIEnt.py", line 343, in <lambda> 9 retry_on_signal(lambda: sock.connect(addr))10 file "/usr/lib64/python2.7/socket.py", line 224, in meth11 return getattr(self._sock,name)(*args)12socket.error: [Errno 110] Connection timed out
这里抛出的异常代码就是socket.error,可以看到这个是socket模块的报错,如果我们要处理这种异常的话,那么需要导入socket模块才可以。
认证失败由于我们在这个系列文章中使用的是ssh的办法,所以会有验证的过程,所以验证失败也是常见的一种异常方式。
来看一下认证失败抛出的异常
1 file "ywsn_p_c_lab3.py", line 11, in <module>2 s.connect(ip,username=user,password='123',look_for_keys=False,allow_agent=False)3 file "/usr/lib/python2.7/site-packages/paramiko/clIEnt.py", line 437, in connect4 passphrase,5 file "/usr/lib/python2.7/site-packages/paramiko/clIEnt.py", line 749, in _auth6 raise saved_exception7paramiko.ssh_exception.AuthenticationException: Authentication Failed.
那么这里的异常代码是什么呢?肯定是paramiko.ssh_exception.AuthenticationException: Authentication Failed.啦~
这里如何做异常处理我就不多说了吧!大家可以参照上面的自己验证一下。
拓扑说明拓扑图说明
我会在IP.txt中写入4个IP,两个在拓扑图中,一个另两个不在,实现网络不通、超时、验证失败、一切ok着三种情况。实现代码
这里为了方便大家看,我就把所有的异常分开了,其实放在一起也是可以的。以下对新代码进行注释,其余代码注释可以查看前两篇文章。
1import paramiko 2import socket # 导入socket模块 3import time 4user = 'yunwsn' 5passwd = '123456' 6s = paramiko.SSHClIEnt() 7s.set_missing_host_key_policy(paramiko.autoAddPolicy()) 8IP = file('IP.txt','rb') 910for ip in IP.xreadlines():11 try: # 异常处理12 s.connect(ip,username=user,password=passwd,timeout=5,look_for_keys=False,allow_agent=False)13 print '[ 3[0;32m success3[0m ] login %s ' %ip14 cmd = s.invoke_shell()15 cmd.send('show ip int bri \n ')16 time.sleep(0.1)17 output = cmd.recv(65535)18 print output19 cmd.close()20 except paramiko.ssh_exception.NovalIDConnectionsError: # 网络/端口不通异常21 print '[ 3[0;31m Failed 3[0m ] Unable to connect to %s ' % ip22 except socket.error,err: # 超时异常,err代表异常代码之后的提示23 print '[ 3[0;31m Failed 3[0m ] %s to %s' %(err,ip)24 except paramiko.ssh_exception.AuthenticationException: # 验证失败的异常25 print '[ 3[0;31m Failed 3[0m ] Authentication Failed on %s' % ip2627IP.close()
IP.txt1192.168.108.2522192.168.108.2533192.168.108.2544192.168.108.251
运行效果(动图)总结
以上是内存溢出为你收集整理的运维少年系列 python and cisco (3)全部内容,希望文章能够帮你解决运维少年系列 python and cisco (3)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)