为什么里面的返回最终会给出空字典?

时间:2017-12-12 16:55:03

标签: python python-3.x dictionary exception try-catch

我想跟踪字典中的异常并返回相同的内容。但是当我这样做时,最后阻止给了我一个空字典。逻辑几乎适用于标量。有人可以解释一下这种行为吗。

在标量上下文中:

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
{}

2 个答案:

答案 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子句,包括任何exceptelse子句。 如果任何子句中发生异常但未处理,则会暂时保存该异常。执行finally子句。如果存在已保存的异常,则会在finally子句的末尾重新引发异常。如果finally子句引发另一个异常,则将保存的异常设置为新异常的上下文。 如果finally子句执行returnbreak语句,则会丢弃已保存的异常 [。]

(大胆强调我的)。

答案 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"
   }