0

У меня есть 15 попыток за исключением операторов в цикле for в коде. Я думаю, что это может быть обобщено, но я не могу добраться до решения. Как мне это сделать.хороший способ обобщить несколько попыток, кроме

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")) 

я получаю пустой вывод, тогда вызова попробовать: за исключением: дает правильный вывод. Что происходит не так?

+0

Вы можете найти это полезным: [Несколько кодов попробовать в один блок] (HTTP: // stackoverflow.com/questions/17322208/multiple-try-codes-in-one-block) –

+1

никогда не записывайте 'except:', всегда указывайте, какое исключение вы ловите, то есть 'except AttributeError:' –

ответ

2

Без изменения данных:

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

a = try_something(item.something) 

Помните, что вы можете свободно проходить вызываемым (функция или метод) в качестве параметра функции Python. Это использует это. Тем не менее, может быть еще лучший способ сделать это, рефакторинг класса item, но для этого потребуется дополнительная информация.

Кроме того, вы не знаете, какой тип исключения выбрасывается? Если вы это сделаете, вы должны быть более явными в инструкции except.

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")) вы звоните 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 .

+0

Ну его a хороший информация. Но одна вещь, которую я наблюдал, - это то, что функция возвращается, даже если одна из функций вызывает ошибку. т. е. если a = item.something() не работает, он не переходит к b = item.something2(). Это нежелательное поведение. b = item.something2() должен выполняться, даже если a = item.something() выдает исключение – raj247

+0

Когда исключение, которое обрабатывается, поймано, блок 'with' будет завершен, и выполнение будет возобновлено в конце блока, поэтому если каждая часть находится в своем собственном 'с catch (...)' блоком, то она должна работать корректно.Это не означает «подавлять все исключения, подобные этому в этом блоке», это не так много, чем исходная «попытка: кроме:' –

+0

Я получал ошибку issubclass() arg 1 должен быть классом – raj247

 Смежные вопросы

  • Нет связанных вопросов^_^