在Python 3中,我可以将参数传递给异常并将其打印出来:
try:
raise Exception('my exception')
except Exception as ex:
print(ex.args)
('我的例外',)
如果我定义了一个自定义异常,它会将每个字母作为参数打印出来。我做错了什么?
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg
try:
raise Networkerror('Bad hostname')
except Networkerror as e:
print(e.args)
('B','a','d','','h','o','s','t','n','a','m','e' )
答案 0 :(得分:4)
args
attribute of BaseException
is documented to be a tuple
,但您为其分配了一个简单str
。这恰好起作用,因为str
是其角色的可迭代;打开包装进行打印时,它们看起来与tuple
个单字母相同。您可以用单个元素tuple
包装来修复:
class Networkerror(RuntimeError):
def __init__(self, arg):
self.args = arg,
或接受隐式产生tuple
的位置变量:
class Networkerror(RuntimeError):
def __init__(self, *args):
self.args = args
或者只是不在子类上定义__init__
并让基类正常处理它(当你没有需要自己处理的特殊参数时,通常是正确的解决方案):
class Networkerror(RuntimeError):
pass