0

我一直在爲連續兩天提出Google Big Query的例外做準備。我終於想出瞭如何使它工作的方式,但我不明白它爲什麼起作用。我正在尋求幫助,以更好地瞭解我的代碼中發生了什麼。我已經搜遍了堆棧溢出,似乎沒有任何幫助。需要幫助才能瞭解異常處理的工作原理

這是我的觀點...

@api_view(['POST']) 
def delete_table(request): # Deletes table from Big Query 
    project_id = request.POST.getlist('data[]')[0] 
    dataset_id = request.POST.getlist('data[]')[1] 
    table_id = request.POST.getlist('data[]')[2] 

    bq = BigQuery(project_id) # Instantiates BQ instance specific to project id 
    try: 
     bq.deleteTable(dataset_id, table_id) # Calls deleteTable method from BQ instance 

    except Exception, res: 
     logger.debug(res) 

    return Response('') 

這是我在我的大查詢控制器刪除方法...

def deleteTable(self, datasetId, tableId): 

    try: 
     response, content = \ 
      self.http_auth.request("https://www.googleapis.com/bigquery/v2/projects/%s/datasets/%s/tables/%s" % (self.PROJECT_ID, datasetId, tableId), "delete") 

     content = json.loads(content) 
     message = content['error']['message'] 
     raise Exception, message 
    except: 
     if response.status < 300: 
      message = tableId + " Was Deleted." 
      raise Exception, message 
     else: 
      raise Exception, message 

據我所知, view正在從bqcontroller捕獲一個引發的錯誤,我不明白t他在bqcontroller中提出錯誤。有人能幫助解決一些問題嗎?

+0

爲什麼拋出異常只能立即捕獲? – user2357112

+2

您的'try'塊包含一個'raise'語句,因此它總是**引發一個異常。當然,你只想在「except」塊中引發異常?同樣在except塊中,由於您提供了自己的消息,因此您將丟失可能從API調用返回的任何特定消息。 –

+1

您似乎正在使用異常來代替'return'語句。你也捕捉*幾乎所有例外*。是否沒有更具體的例外(或一組例外)在這裏? –

回答

1

由於代碼是,沒有爲try沒有真正的理由,因爲在try塊你總是引發異常的結束,所以你經常去except塊。因此,每次代碼運行時,它都會經過try,然後遇到異常,因此會去到except塊,在該塊中引發異常,無論您使用if/else語句的哪個分支。

這裏這段代碼做同樣的事情,它只是一點點清潔(減少重複),所以你可以看到那裏的異常被提出

def deleteTable(self, datasetId, tableId): 
    GOOG_API_ENDPOINT = 'https://www.googleapis.com/bigquery/v2/projects/{}/datasets/{}/tables/{}' 
    url = GOOG_API_ENDPOINT.format(self.PROJECT_ID, datasetId, tableId) 

    response, json_content = self.http_auth.request(url, "delete") 
    content = json.loads(json_content) # don't reassign same variable name 

    if response.status < 300: 
     message = tableId + " Was Deleted." 
     raise Exception, message # exception raised here or in else below 
    else: 
     message = content.get('error', {}).get('message') 
     raise Exception, message 

雖然我也不會提高通用Exception,我d使用built-insdefine your own之一