V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ri0day
V2EX  ›  Python

python exception 处理的疑问

  •  
  •   ri0day ·
    ri0day · 2015-06-23 16:12:27 +08:00 · 3737 次点击
    这是一个创建于 3441 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前有一个脚本,脚本功能就是通过ssh读取远端的日志,然后tail似输出.脚本如下:

    !/usr/bin/python

    from sshtail import SSHTailer ,load_rss_key
    from time import sleep
    pkey=load_rsa_key('id_rsa')
    tailer = SSHTailer('[email protected]', '/var/log/mytest.log',private_key=pkey)
    while 1:
    for line in tailer.tail():
    print line
    sleep(1)

    脚本在正常情况下可以正常运行,但是当那个日志文件不存在的时候,就会raise 一个ioerror exception,
    于是我改脚本,思路是当碰到这个ioerror 的时候我不退出脚本,取而代之的是sleep 5秒(5s 内我会自己去创建那个mytest.log文件)然后再继续干活.
    于是改成如下:
    #!/usr/bin/python
    from sshtail import SSHTailer ,load_rsa_key
    from time import sleep
    pkey=load_rsa_key('id_rsa')
    tailer = SSHTailer('[email protected]', '/var/log/mytest.log',private_key=pkey)
    try:

    while 1:
        for line in tailer.tail():
            print line
            sleep(1)
    

    except IOError, e:
    print "error: %s"%e
    print 'catch an io error'
    #tailer.disconnect()
    sleep(5.0)
    while 1:
    for line in tailer.tail():
    print line
    sleep(1)

    最后发现还是会退出脚本。报错如下:

    error: [Errno 2] No such file
    catch an io error
    Traceback (most recent call last):
    File "/home/wumin/1.py", line 24, in <module>
    for line in tailer.tail():
    File "/usr/local/lib/python2.7/site-packages/sshtail/tailers.py", line 57, in tail
    fstat = self.sftp_client.stat(self.remote_filename)
    File "/usr/local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 413, in stat
    t, msg = self._request(CMD_STAT, path)
    File "/usr/local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 729, in _request
    return self._read_response(num)
    File "/usr/local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 776, in _read_response
    self._convert_status(msg)
    File "/usr/local/lib/python2.7/site-packages/paramiko/sftp_client.py", line 802, in _convert_status
    raise IOError(errno.ENOENT, text)
    IOError: [Errno 2] No such file

    我的目的就是要在我这个脚本里面实现,发现 ioerror exception 不退出脚本,而是sleep ,然后等那个/var/log/mytest.log生成了以后还是继续干活.
    这个该怎么处理这个exception呢.要改sshtail这个库或者 paramiko里面的代码才能做到吗?一定要在所有涉及到的代码里面都处理这个ioerror exception才能做到吗?

    求教

    7 条回复    2015-06-24 13:10:41 +08:00
    ri0day
        1
    ri0day  
    OP
       2015-06-23 16:20:25 +08:00
    v2ex 怎么让代码保持格式.
    cc7756789
        2
    cc7756789  
       2015-06-23 16:36:40 +08:00
    @ri0day 用markdown语法
    ri0day
        3
    ri0day  
    OP
       2015-06-23 16:39:51 +08:00
    @cc7756789 时间到了,没办法改啦。
    yangtukun1412
        4
    yangtukun1412  
       2015-06-23 17:38:41 +08:00
    while True:
    try:
    do_something()
    except IOError, e:
    log_error()

    把 try catch 写在循环里面。
    yangtukun1412
        5
    yangtukun1412  
       2015-06-23 17:40:09 +08:00
    | while True:
    | try:
    | do_something()
    | except IOError, e:
    | log_error()

    这样子格式应该不会乱掉了吧...
    ri0day
        6
    ri0day  
    OP
       2015-06-23 22:35:02 +08:00
    @yangtukun1412 谢谢 ,问题解决了。
    try确实要写在while true 里面.
    dalang
        7
    dalang  
       2015-06-24 13:10:41 +08:00
    我觉得是因为你 sleep 了 5s 后,那个文件仍然没有创建,于是又 raise ioerrror。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   995 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:10 · PVG 04:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.