0

Ich habe seit zwei Tagen mit dem Auslösen von Ausnahmen für Google Big Query experimentiert. Ich habe schließlich herausgefunden, wie es funktioniert, so wie es funktionieren sollte, aber ich verstehe nicht wirklich, warum es funktioniert. Ich suche nach Unterstützung, um besser zu verstehen, was in meinem Code vor sich geht. Ich habe Stack Overflow bereits durchforstet und nichts scheint mir zu helfen.Hilfe erforderlich, um zu verstehen, wie die Ausnahmebehandlung funktioniert

Hier ist meine Ansicht ...

@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('') 

Hier ist meine Delete-Methode in meinen Big Query-Controller ...

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 

Ich verstehe, dass die view ist ein erhöhter Fehler von der bqcontroller, ich verstehe nicht, wie t Die Fehler werden in der bqcontroller ausgelöst. Könnte jemand bitte helfen, Licht zu holen?

+0

Warum werfen Sie eine Ausnahme, nur um es sofort zu fangen? – user2357112

+2

Ihr 'try' Block enthält eine' raise' Anweisung, daher löst ** ** ** immer eine Ausnahme aus. Sicherlich wollen Sie nur eine Exception im 'except' Block auslösen? Da Sie Ihre eigene Nachricht bereitstellen, verlieren Sie auch im Block "except" eine bestimmte Nachricht, die möglicherweise vom API-Aufruf zurückgegeben wurde. –

+1

Sie scheinen Ausnahmen anstelle einer 'return' Anweisung zu verwenden. Sie fangen auch * fast alle Ausnahmen *. Gibt es hier keine spezifischere Ausnahme (oder eine Reihe von Ausnahmen)? –

Antwort

1

Da der Code ist, gibt es keinen wirklichen Grund für die try weil am Ende des try Block Sie immer eine Ausnahme auslösen, so dass Sie immer auf dem except Block gehen. Also jedes Mal, wenn der Code läuft, geht es durch die try, dann trifft die Ausnahme so geht zum except Block, wo es eine Ausnahme auslöst, egal welcher Zweig der if/else-Anweisung Sie gehen.

Dieser Code ist das gleiche, es ist nur ein wenig sauber (weniger Doppel), so dass Sie, wo die Ausnahmen

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 

Obwohl ich nicht ein allgemeines Exception erhöhen würde, ‚angehoben werden sehen können ich Verwenden Sie einen der built-ins oder define your own

Verwandte Themen