2016-08-22 89 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