Чисто Python способ обернуть отдельные операторы в try, кроме блока

В настоящее время я делаю некоторую автоматизацию Python для Excel с помощью com. Он полностью функционален и делает то, что я хочу, но я обнаружил нечто удивительное. Иногда некоторые из команд Excel, которые я использую, завершаются с ошибкой без видимой причины. В других случаях они будут работать.

В VB-эквивалентном коде того, что я делаю, эта проблема, по-видимому, считается нормальной и оштукатурена с помощью выражения On Error Resume Next. Python, конечно, не сказал этого утверждения.

Я не могу обернуть весь набор в цикл try except, потому что он мог «провалиться» на полпути и не завершиться должным образом. Итак, каков будет питонный способ заключить несколько независимых операторов в попытку, кроме блока? В частности, что-то чище, чем:

try:
   statement
except:
   pass
try:
   statement
except:
   pass

Соответствующим кодом является бит excel.Selection.Borders.

def addGridlines(self, infile, outfile):
    """convert csv to excel, and add gridlines"""
    # set constants for excel
    xlDiagonalDown = 5
    xlDiagonalUp = 6
    xlNone = -4142
    xlContinuous = 1
    xlThin = 2
    xlAutomatic = -4105
    xlEdgeLeft = 7
    xlEdgeTop = 8
    xlEdgeBottom = 9
    xlEdgeRight = 10
    xlInsideVertical = 11
    xlInsideHorizontal = 12
            # open file
    excel = win32com.client.Dispatch('Excel.Application')
    workbook = excel.Workbooks.Open(infile)
    worksheet = workbook.Worksheets(1)

    # select all cells
    worksheet.Range("A1").CurrentRegion.Select()
    # add gridlines, sometimes some of these fail, so we have to wrap each in a try catch block
    excel.Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    excel.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    excel.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    excel.Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous
    excel.Selection.Borders(xlEdgeLeft).Weight = xlThin
    excel.Selection.Borders(xlEdgeLeft).ColorIndex = xlAutomatic
    excel.Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
    excel.Selection.Borders(xlEdgeTop).Weight = xlThin
    excel.Selection.Borders(xlEdgeTop).ColorIndex = xlAutomatic
    excel.Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
    excel.Selection.Borders(xlEdgeBottom).Weight = xlThin
    excel.Selection.Borders(xlEdgeBottom).ColorIndex = xlAutomatic
    excel.Selection.Borders(xlEdgeRight).LineStyle = xlContinuous
    excel.Selection.Borders(xlEdgeRight).Weight = xlThin
    excel.Selection.Borders(xlEdgeRight).ColorIndex = xlAutomatic
    excel.Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
    excel.Selection.Borders(xlInsideVertical).Weight = xlThin
    excel.Selection.Borders(xlInsideVertical).ColorIndex = xlAutomatic
    excel.Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous
    excel.Selection.Borders(xlInsideHorizontal).Weight = xlThin
    excel.Selection.Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
    # refit data into columns
    excel.Cells.Select()
    excel.Cells.EntireColumn.AutoFit()
    # save new file in excel format
    workbook.SaveAs(outfile, FileFormat=1)
    workbook.Close(False)
    excel.Quit()
    del excel

Обновление :

Возможно, потребуется немного пояснений к биту ошибки. Два идентичных запуска на моей тестовой машине с одинаковым кодом в одном и том же файле дают одинаковый результат. Один прогон создает исключения для каждой строки xlInsideVertical. Другой бросает исключения для каждого xlInsideHorizontal. Наконец, третий прогон завершается без каких-либо исключений.

Насколько я могу судить , Excel считает это нормальным поведением, потому что я клонирую код VB, созданный генератором макроса Excel, а не код VB, созданный человеком. Конечно, это может быть ошибочным предположением.

Он будет работать с каждой строкой, заключенной в блок try, за исключением того, что я просто хотел что-то более короткое и более очевидное, потому что 20 строк, обернутых в их собственные циклы try catch, просто позже вызывают проблемы.

Update2 :

Это очищенный CSV-файл для тестирования: gist-файл

Заключение :

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

8
задан Maniero 4 February 2015 в 12:03
поделиться