我想跟踪字典中的异常并返回相同的内容。但是当我这样做时,最后阻止给了我一个空字典。逻辑几乎适用于标量。有人可以解释一下这种行为吗。
在标量上下文中:
def test():
temp = 1
try:
raise ValueError("sdfs")
except:
temp = 2
finally:
temp = temp + 3
return temp
test()
5
使用字典:
def test():
temp = dict()
try:
raise ValueError("something")
except Exception as error:
print("error is :{}".format(error))
temp['except'] = "something" + error
finally:
return temp
test()
error is : something
{}
答案 0 :(得分:6)
您在异常处理程序中引发了另一个异常,由于从函数返回finally
处理程序而被吞下。
您不能仅仅连接异常对象和字符串,因此会引发额外的TypeError
,并且永远不会到达字典的分配。
首先将异常转换为字符串:
>>> def test():
... temp = dict()
... try:
... raise ValueError("something")
... except Exception as error:
... print("error is :{}".format(error))
... temp['except'] = "something" + str(error)
... finally:
... return temp
...
>>> test()
error is :something
{'except': 'somethingsomething'}
来自try
statement documentation:
如果存在
finally
,则指定'清理'处理程序。执行try
子句,包括任何except
和else
子句。 如果任何子句中发生异常但未处理,则会暂时保存该异常。执行finally
子句。如果存在已保存的异常,则会在finally
子句的末尾重新引发异常。如果finally
子句引发另一个异常,则将保存的异常设置为新异常的上下文。 如果finally
子句执行return
或break
语句,则会丢弃已保存的异常 [。]
(大胆强调我的)。
答案 1 :(得分:4)
行"something" + error
引发错误,因为您从finally
返回,该错误将被丢弃。由于该错误,从未执行对字典temp
的分配,给人的印象是没有任何反应。
try-except
try
中说明了这一点:
如果finally存在,则指定'cleanup'处理程序。
temp['except'] = error
执行子句,包括任何except和else子句。 如果是 异常发生在任何条款中,并且不处理, 异常暂时保存。 finally子句被执行。如果 有一个保存的异常,它会在finally的末尾重新引发 条款。如果finally子句引发另一个异常,则保存 exception被设置为新异常的上下文。 若最后 子句执行return或break语句,保存的异常是 丢弃。
(强调我的)
没有错误(即>>> test()
error is :something
{'except': ValueError('something')}
您会得到预期的行为:
protoc {
artifact = 'com.google.protobuf:protoc:3.5.0'
}
plugins {
grpc {
artifact = "io.grpc:protoc-gen-grpc-java:1.7.0"
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
} }
dependencies {
compile "com.google.api.grpc:proto-google-common-protos:1.0.0"
compile "io.grpc:grpc-netty:1.7.0"
compile "io.grpc:grpc-protobuf:1.7.0"
compile "io.grpc:grpc-stub:1.7.0"
}