2009-05-18 3 views
3
  • Я бы хотел избежать написания errorCount += 1 в более чем одном месте.
  • Я ищу лучший способ, чем
 
    success = False 
    try: 
     ... 
    else: 
     success = True 
    finally: 
     if success: 
      storage.store.commit() 
     else: 
      storage.store.rollback() 
  • Я пытаюсь избежать store.rollback() в каждом, за исключением п.

Любая идея о том, как это сделать?попробуйте ... за исключением ... кроме ...: как избежать повторения кода

count = 0 
successCount = 0 
errorCount = 0 
for row in rows: 
    success = False 
    count += 1 
    newOrder = storage.RepeatedOrder() 
    storage.store.add(newOrder) 
    try: 
     try: 
      newOrder.customer = customers[row.customer_id] 
     except KeyError: 
      raise CustomerNotFoundError, (row.customer_id,) 
     newOrder.nextDate = dates[row.weekday] 
     _fillOrder(newOrder, row.id) 
    except CustomerNotFoundError as e: 
     errorCount += 1 
     print u"Error: Customer not found. order_id: {0}, customer_id: {1}".format(row.id, e.id) 
    except ProductNotFoundError as e: 
     errorCount += 1 
     print u"Error: Product not found. order_id: {0}, product_id: {1}".format(row.id, e.id) 
    else: 
     success = True 
     successCount += 1 
    finally: 
     if success: 
      storage.store.commit() 
     else: 
      storage.store.rollback() 
print u"{0} of {1} repeated orders imported. {2} error(s).".format(successCount, count, errorCount) 

ответ

8

Это выглядит как возможное применение нового with заявления Python. Это позволяет оперативно отключать операции и выделять ресурсы независимо от того, какой результат имел блок кода.

Читайте об этом в PEP 343

+1

Похоже, мой код может сильно улучшить с помощью оператора-оператора. –

2

Вы можете просто обернуть вашу реализацию исключения внутри исключение определенного класса контейнера, таким образом, вы можете также избежать всех этих явных вызовов для печати (которые могут пригодиться, когда вы изменить свой интерфейс, например, при поддержке графического интерфейса), вместо этого у вас будет такой метод, как ошибка (msg), которая, в свою очередь, может внутренне увеличить количество ошибок соответственно. Другими словами, просто настройте внешний вспомогательный класс, который управляет вашим материалом обработки исключений.

0

Если вам нравится кумулировать ошибки, почему вы не кумулируете ошибки? Если вы помещаете сообщения об ошибках в список, размер списка дает необходимую вам информацию. Вы можете даже постпроцессировать что-то. Вы можете решить легко, если произошла ошибка и печать вызывается только в одном месте

0

Ну, в соответствии с этой страницы, часть 7.4:

http://docs.python.org/reference/compound_stmts.html

Это возможно с питоном вер. > = 2.6. Я имею в виду попытку ... кроме строительства.

+0

Я думаю, вы не поняли мой вопрос. –

3

Мое предложение было бы написать метод logError(), который увеличивает errorCount (делает его переменной-членом) и печатает ошибку. Так как ваш код исключения аналогично, вы можете также сократить свой код, делая это:

try: 
    # something 
except (CustomerNotFoundError, ProductNotFoundError), e: 
    logError(e) 

Вы можете печатать все, что вы хотите на основе e.

Кроме того, вам не нужно отслеживать succeses: successCount = len(rows) - errorCount

+0

successCount = len (rows) - errorCount: не всегда работает в моем примере, поскольку я не всегда напрямую работаю с строками. –

+0

Есть много веских причин сделать один метод, который обрабатывает объекты исключений, и вызывать его всякий раз, когда ваш код попадает в исключение, являющееся ошибкой. –

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