2012-09-29 31 views
-1
class MyException(Exception): 
    def __str__(self): 
     return self.args[0] 


def DoWork(): 
    raise MyException("My hoverboard is full of eels") 
    pass 

if __name__ == '__main__': 
    try: 
     DoWork() 
    except MyException as ex: 
     print("This will get printed: " + str(ex)) #Line1 
     print("This will not get printed and will raise exception: " + ex) #Line2 

为什么异常需要,如图2号线在1号线在理想情况下它应该工作的一个显式转换。 注:我已经尝试了两种 - 从MyException类删除str,并添加str;他们都没有工作。 请帮忙。Python3:为什么异常需要显式转换而打印的消息

回答

2

您,是因为x + y结束调用x.__add__(y)将其转换为一个字符串,所以当x就是你所谓str.__add__一个字符串,它运行在两个字符串,而不是一个字符串和一个例外。构建在运算符和类型中的Python通常不会自动尝试强制事物成为正确的类型(例如JavaScript),因此必须明确。例如,这与在x = 1 + int("12")中不得不使用int()没有什么不同。

需要注意的是,如果你不希望使用str(),您可以使用%格式:

print("This will also work: %s" % ex) 
+0

那么为什么打印(EX)的作品?即使是使用隐式转换。 – AshishTheDev

+0

'print()'不使用隐式转换,它将一个对象作为它的参数(确保它最终调用'__str__'或'__repr__',但这不是真正相关的)。 'x + y'调用'x .__ add __(y)',当'x'是'str','y'需要'str'或者你会得到一个异常。如果你真的希望'str + MyType'正常工作,你可以在'MyType'中实现'__add__'和'__radd__',并使它们与'str'参数一起工作,但这太可怕了。 – verdesmarald

相关问题