如何理解异常处理是如何工作的?

Posted

技术标签:

【中文标题】如何理解异常处理是如何工作的?【英文标题】:How to understand how exception handling is working? 【发布时间】:2016-06-09 16:42:55 【问题描述】:

我一直在为 Google Big Query 提出例外问题。我终于想出了如何让它以它应该工作的方式工作,但我真的不明白它为什么工作。我希望更好地了解我的代码中发生了什么。我已经搜索过 Stack Overflow,但似乎没有任何帮助。

这是我的看法:

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

这是我在 Big Query 控制器中的删除方法:

    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 的引发错误,我不明白bqcontroller 中的错误是如何引发的。有人可以解释一下吗?

【问题讨论】:

为什么你抛出异常只是为了立即捕获它? 您的 try 块包含 raise 语句,因此它总是引发异常。您肯定只想在except 块中引发异常吗?同样在 except 块中,由于您提供自己的消息,因此您将丢失任何可能从 API 调用返回的特定消息。 您似乎使用异常来代替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,但我会使用built-ins 或define your own 之一

【讨论】:

以上是关于如何理解异常处理是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

2017-9-1 - Q - 异常处理 - 多线程基础

Java中的异常处理

Java 异常处理

《深入理解Java虚拟机》- JVM如何进行异常处理

Java基础-异常处理机制及其设计

Koa异常处理说明