自定义异常打印每个参数字母是什么?

时间:2016-02-04 03:36:26

标签: python-3.x

在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' )

1 个答案:

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