【问题标题】:python catching exceptionpython捕捉异常
【发布时间】:2023-04-04 01:01:01
【问题描述】:

我正在运行 curl 命令来检查网站的状态:

try:
    connectionTest = subprocess.Popen([r"curl --interface xx.xx.xx.xx http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    cstdout,cstderr = connectionTest.communicate()
    if cstdout:
        #print cstdout
        status = "OK"
    elif cstderr:
        #print cstderr
        status = "PROBLEM"
except:
    e = sys.exc_info()[1]
    print "Error: %s" % e

代码工作正常,除了 try:except 语句,因为它没有正确捕获异常,下面是接口关闭时脚本的输出,现在我想在 except 语句中捕获第一行.. . 而是它被生成了……这可能吗??

SIOCSIFFLAGS: Cannot assign requested address

PROBLEM

【问题讨论】:

  • 向我们展示整个堆栈跟踪。是什么让你觉得有问题?如果您的 except 子句没有被触发,则没有异常。
  • 如果 curl 命令的输出出现问题,只需引发异常。

标签: python linux


【解决方案1】:

没有抛出异常。 可以查看返回码,不为零时抛出异常:

import sys, subprocess
try:
    connectionTest = subprocess.Popen([r"curl --interface 1.1.1.1 http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    cstdout,cstderr = connectionTest.communicate()
    if connectionTest.returncode:
        raise Exception("Curl returned %s"%connectionTest.returncode)
    if cstdout:
        #print cstdout
        status = "OK"
    elif cstderr:
        #print cstderr
        status = "PROBLEM"
except:
    e = sys.exc_info()[1]
    print "Error: %s" % e

【讨论】:

    【解决方案2】:

    如果子进程中发生任何异常,它不会被抛出。 检查 stderr 并引发适当的异常

    try:
        connectionTest = subprocess.Popen([r"curl --interface xx.xx.xx.xx http://www.yahoo.com"], shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
        cstdout,cstderr = connectionTest.communicate()
        if cstdout:
            #print cstdout
            status = "OK"
        elif cstderr:
            #print cstderr
            status = "PROBLEM"
            raise some exception
    except:
        e = sys.exc_info()[1]
        print "Error: %s" % e
    

    【讨论】:

      【解决方案3】:

      您确定需要调用 curl 吗?

      import urllib2
      try:
          urllib2.urlopen("http://www.yahoo.com")
      except urllib2.URLError as err:
          print(err)
      except urllib2.HTTPError as err:
          print(err)
      

      其次,听起来您的接口地址是狡猾的,而不是您的代码。检查 --interface 标志参数的正确性(即:在 python 之外运行 curl 命令并检查它是否按预期工作。

      一般来说,您将永远无法在您的 python 程序中捕获子进程错误(我认为您要问的是)。您将不得不依赖退出代码stdout/err输出,这就是依赖Python的included batteries的解决方案会更加健壮的原因。

      如果需要手动指定接口,还有其他几种选择:

      1. PyCurl:

        import pycurl
        import StringIO
        c = pycurl.Curl()
        c.setopt(pycurl.URL, "http://www.python.org/")
        c.setopt(pycurl.CURLOPT_INTERFACE, "eth0")
        # [...]
        try:
            c.perform()
        except: # Handle errors here.
          pass 
        
      2. Change the source interface manually in python for urllib2

      【讨论】:

        猜你喜欢
        • 2012-01-10
        • 2020-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 2012-03-20
        相关资源
        最近更新 更多