如何理解异常处理是如何工作的?
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 之一
【讨论】:
以上是关于如何理解异常处理是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章