В настоящее время принято ответ будет работать только тогда, когда вызываемая не принимают аргументы, чтобы выполнить небольшой фрагмент кода и подавить определенную погрешность может поднять легче было бы использовать контекстный менеджер:
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"))
вы звоните item.get("data-a")
без каких-либо проверок ошибок и передач возвращаемого значения в self.attrs
, если результат может быть вызван, пытаясь позвонить ему в self.attrs
поднимет TypeError
. Вам нужно будет передать вызываемый, который не принимает аргументов для принятого ответа на работу, для этого требуется только версия python версии 2.7+ для поддержки инструкции with
.
Кстати, если item
является dict
то dict.get
никогда не возбудит исключение, то в the documentation
get(key[, default])
Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None
, so that this method never raises a KeyError
.
Вы можете найти это полезным: [Несколько кодов попробовать в один блок] (HTTP: // stackoverflow.com/questions/17322208/multiple-try-codes-in-one-block) –
никогда не записывайте 'except:', всегда указывайте, какое исключение вы ловите, то есть 'except AttributeError:' –