Python Try / Catch:在Exception时只需转到下一个语句

时间:2014-03-29 20:21:29

标签: python exception

假设我有以下Python代码:

x = some_product()
name        = x.name
first_child = x.child_list[0]
link        = x.link
id          = x.id

x.child_list 时,第3行可能会出现问题。这显然给了我一个 TypeError ,说:

'NoneType' Object has no attribute '_____getitem_____'

我想要做的是,每当 x.child_list [0] 给出 TypeError 时,只需忽略该行并转到下一行,即“< strong> link = x.link “......

所以我猜这样的事情:

try:
    x = some_product()
    name        = x.name
    first_child = x.child_list[0]
    link        = x.link
    id          = x.id
Except TypeError:
    # Pass, Ignore the statement that gives exception..

我应该在Except块下放置什么? 或者还有其他方法可以做到这一点吗?

我知道我可以使用如果x.child_list不是None:... ,但我的实际代码要复杂得多,我想知道是否有更多的pythonic方法可以做此

4 个答案:

答案 0 :(得分:8)

你在考虑的是:

try:
    x = some_product()
    name        = x.name
    first_child = x.child_list[0]
    link        = x.link
    id          = x.id
except TypeError:
    pass

但是,最好的做法是尽可能少地放在try/catch块中:

x = some_product()
name = x.name
try:
    first_child = x.child_list[0]
except TypeError:
    pass
link = x.link
id = x.id

但是,你真正应该在这里做的是完全避免try/catch,而是做这样的事情:

x = some_product()
name = x.name
first_child = x.child_list[0] if x.child_list else "no child list!"
# Or, something like this:
# first_child = x.child_list[0] if x.child_list else None
link = x.link
id = x.id

当然,您的选择最终取决于您所希望的行为 - 您是否希望first_child未定义,等等。

答案 1 :(得分:3)

由于您只想在该行上处理异常,因此只能在那里捕获它。

x = some_product()
name        = x.name
try:
  first_child = x.child_list[0]
except TypeError:
  first_child = None
link        = x.link
id          = x.id

答案 2 :(得分:2)

当您捕获异常时直接移出try范围,更好的解决方案是通过修改该行中的代码来防止异常发生:

if x.child_list[0] != None:
    first_child = x.child_list[0]

希望这会有所帮助。

修改

当你编辑你的问题并且你不想要这个解决方案时,唯一的方法是在该特定行之后立即捕获异常:

try:
    first_child = x.child_list[0]
except TypeError:
    pass

答案 3 :(得分:2)

  

当x.child_list为None时,第3行可能会出现问题。这显然给了我一个TypeError,说:

我认为用异常做这件事是不好的方法。 str / unicode,list,tuple types有 getitem 方法或任何其他自定义类可能包含此方法。如果您正在寻找仅使用元组/列表的解决方案,此代码将帮助您:

x = some_product()
name = x.name
first_child = (lambda x: x[0] if isinstance(x, list) or isinstance(x, tuple) else None)(x.child_list)
link = x.link
id = x.id

请阅读有关格式化python代码的PEP8。