2016-08-22 98 views
-3

我不是一个蟒蛇怪胎,但试图解决这个问题,使用类似问题的几个答案的信息,但似乎没有真正的工作在我的情况。那就是:蟒蛇尝试和异常

我打电话从一个Python脚本的功能: 下面是函数:

def getsom(X): 
    #some codes 
    try: 
     st = get data from site 1 using X 
    except: 
     print "not available from site 1, getting from site 2" 
     st = get data from site 2 using X 

    #some codes that depend on st 

我从Python脚本调用该为这样的:

#some codes 
for yr in range(min_yr,max_yr+1): 
    day=1 
    while day<max_day: 
     st1 = getsom(X) 
     #some code that depends on st1 
     day+=1 

这当特定日期的数据在站点1或2上可用时正常工作,但当两个站点在另一天不可用时数据会中断。

我希望能够在第二天检查两个站点的特定日期是否无法使用数据。我尝试过不同的尝试配置,除非没有成功,并希望能够以最有效的方式执行此操作。

谢谢!

***编辑 奏效最终版本:

在功能部件:

def getsom(X): 
    #some codes 
    try: 
     st = get data from site 1 using X 
    except: 
     print "not available from site 1, getting from site 2" 
     st = get data from site 2 using X 

     try: 
      st = get data from site 2 using X 
     except: 
      print "data not available from sites 1 and 2" 
      st=None 
    if st is not None: 
     #some codes that depend on st 

为了重复,以对剧本侧的第二天,我不得不处理的情况下,无从另一个尝试的功能/ except块:

#some codes 
for yr in range(min_yr,max_yr+1): 
    day=1 
    while day<max_day: 


    try: 
     st=getsom(X) 
    except: 
     st=None 

    if st is not None: 
     #some codes that depend 
+2

因此,包装的代码在'试/ except'了'except'块... – ForceBru

+0

不知道为什么我有向下投4点不到一分钟。@ ForceBru ...感谢您的建议,我试过了,但似乎没有得到它的工作。你可以举个例子 – QP1

+1

'getsom'的代码几乎可以。你在'try/except'结构中封装了'st =从站点1获取数据',所以你应该使用'st =从站点2获取数据'。目前的答案是正确的。 – ForceBru

回答

2

正如你看起来像你的评论中提到要捕获异常第一级异常处理程序。你可以这样说:

def getsom(X): 
    #some codes 
    try: 
     st = get data from site 1 using X 
    except: 
     print "not available from site 1, getting from site 2" 
     try: 
      st = get data from site 2 using X 
     except: 
      print "Not available from site 2 as well." 
      # Here you can assign some arbitrary value to your variable (like None for example) or return from function. 

    #some codes that depend on st 

如果数据是不可用的既不是你可以指定一些任意值的站点到您的变量st或简单地从函数返回。

这是你在找什么? 此外,你不应该简单地写except没有指定你期望的异常类型 - 看看这里的更多信息:如果你不知道某一天的数据

Should I always specify an exception type in `except` statements?

编辑回答中注释的问题你可以return None和处理这样的:

#some codes 
for yr in range(min_yr,max_yr+1): 
    day=1 
    while day<max_day: 
     st1 = getsom(X) 
     if st1 is not None: 
      #some code that depends on st1 
     day+=1 
+1

这应该工作,但使用尝试...除...在另一个尝试不建议根据PEP8。 –

+0

@grael ...感谢所有人的快速回复。使用内部try /除了设置为返回,该函数运行良好,但脚本不会进入第二天,但会退出:“TypeError:'NoneType'对象不可迭代”。将st设置为None(或其他arb。变量)时,try/except块下方的函数的其他依赖部分发生故障,因为找不到数据。 – QP1

+0

@grael ...谢谢一堆,我修改了你的想法,它有效!这只是一个非常长的多功能代码的一部分。检查编辑以查找最终版本。 – QP1

0

你为什么不创建一个单独的功能呢?

def getdata(X): 
    for site in [site1, site2]: # possibly more 
     try: 
      return get_data_from_site_using_X() 
     except: 
      print "not available in %s" % site 
    print "couldn't find data anywhere" 

然后getsom变为:

def getsom(X): 
    #some codes 
    st = getdata(X) 
    #some codes that depend on st