0

我在代码的 for 循环中有 15 个 try except 语句。我认为它可以一概而论,但我无法找到解决方案。我该怎么做。

for item in results:

    try:
        a = item.something()
    except:
        a = ""

    try:
        b = item.something2()
    except:
        b = ""

    b = re.sub(r'\W+', ' ', b)
    b = b.strip()

    try:
        c = item.something3()
        parsed_url = urlparse(b)
        if not bool(parsed_url.scheme):
            break
    except:
        c = ""

    try:
        d = item.something4()
    except:
        d = ""

正如答案中所建议的,我将其概括为

def attrs(self, call_fun):
    try:
        return call_fun()
    except:
        return ""

但是当我打电话

   a = self.attrs(item.get("data-a")) 

我得到一个空白输出,而调用 try: except: 给出正确的输出。怎么了?

4

2 回答 2

2

在不更改数据的情况下:

def try_something(callable):
    try:
        return callable()
    except:
        return ""

a = try_something(item.something)

请记住,您可以自由地将可调用(函数或方法)作为参数传递给 Python 函数。这利用了这一点。但是,通过重构 的类可能还有更好的方法来做到这一点item,但这需要更多信息。

另外,您不知道抛出的异常类型吗?如果你这样做,你应该在except声明中更加明确。

于 2016-07-06T17:48:48.650 回答
1

当前接受的答案仅在可调用对象不带任何参数时才有效,要执行一个小片段并抑制它可能引发的某个错误,使用上下文管理器会更容易:

class catch:
    def __init__(self,err_type):
        valid = True
        if isinstance(err_type, tuple):
            valid = all(issubclass(e, BaseException) for e in err_type)
        else:
            valid = issubclass(err_type, BaseException)
        if not valid:
            raise TypeError("can only catch exception types, not {!r}".format(err_type))
        self.catch_err = err_type

    def __enter__(self):
        return self
    def __exit__(self,typ, err, tb):
        self.err = err #keep a reference if you want to access later.
        if isinstance(err, self.catch_err):
            return True

然后你可以像这样运行你的各个部分:

a = b = c = d = "" #default if any fail.

with catch(Exception): #should really specify what kind of exception you are catching!
    a = item.something()


with catch(Exception): #should really specify what kind of exception you are catching!
    b = item.something2()

b = re.sub(r'\W+', ' ', b)
b = b.strip()

with catch(Exception): #should really specify what kind of exception you are catching!
    c = item.something3()
    parsed_url = urlparse(b)
    if not bool(parsed_url.scheme):
        break

with catch(Exception): #should really specify what kind of exception you are catching!
    d = item.something4()

当你这样做时,你在没有任何错误检查的情况下a = self.attrs(item.get("data-a"))调用并将返回值传递给,除非结果是可调用的,否则尝试调用它会引发一个. 您需要传递一个不带参数的可调用对象才能使接受的答案起作用,这只需要您拥有 python 2.7+ 版本来支持该语句。item.get("data-a")self.attrsself.attrsTypeErrorwith

顺便说一句, if itemis a dictthendict.get永远不会引发异常,它在文档中

get(key[, default])
如果键在字典中,则返回键的值,否则返回默认值。如果未给出默认值,则默认为 None因此此方法永远不会引发KeyError

于 2016-07-12T18:51:10.527 回答