Найти - Пользователи
Полная версия: Отлов ошибки при работе с файлом
Начало » Python для новичков » Отлов ошибки при работе с файлом
1
Cover Story
Всем доброго!
Есть файл данные с которого я забираю следющим образом:
reader = csv.reader(open(config.get('path', 'inpath'), "rb"), delimiter="\t")
invlist = []
for row in reader:
invlist.append(row)
Как мне лучше поставить try except на отсутствие файла, чтобы в дальнейшем избежать таких ошибок как: IOError, UnboundLocalError.

Сейчас остановился на таком варианте:

try:
reader = csv.reader(open(config.get('path', 'inpath'), "rb"), delimiter="\t")
except:
msgBox = QMessageBox()
msgBox.setWindowTitle(u'Внимание')
msgBox.setText(u'Файл отсутствует! <br> Сравните наличие файла и указанного пути в invdrv.ini')
msgBox.setIcon(msgBox.Critical)
msgBox.exec_()
else:
invlist = []
for row in reader:
invlist.append(row)
Но все равно вываливается ошибка UnboundLocalError.
Vader
Есть такое мнение, что UnboundLocalError вываливается из тела except или else, поэтому ваш вопрос не очень понятен. Приведите полный трейс.
Cover Story
Извиняюсь, а что такое трейс?
Cover Story
Например, так подойдет?
    def loadterm(self):
cap = u'Загрузка данных'
if self.chBoxLoad.isChecked():
bodylabel = u'Внимание, все таблицы перед загрузкой будут очищены! <br> Вы действительно хотите загрузить инвентаризационные данные?'
else:
bodylabel = u'Вы действительно хотите загрузить инвентаризационные данные?'

dlg = DialogWindow(cap, bodylabel, u'Загрузить', u'Отказаться')
if dlg.exec_():
if self.chBoxLoad.isChecked():
dll.FormNumber = 1
dll.Clear()
dll.FormNumber = 0
dll.Clear()

try:
reader = csv.reader(open(config.get('path', 'inpath'), "rb"), delimiter="\t")
except:
msgBox = QMessageBox()
msgBox.setWindowTitle(u'Внимание')
msgBox.setText(u'Файл отсутствует! <br> Сравните наличие файла и указанного пути в invdrv.ini')
msgBox.setIcon(msgBox.Critical)
msgBox.exec_()
else:
invlist = []
#Записываем данные в буфер драйвера
for row in reader:
invlist.append(row)


dll.FormNumber = 0 # Активируем первую таблицу для ввода инвентаризационных данных

try:
dll.BeginAdd()#Подготавливаемся к записи данных в ТСД
for row in invlist:
dll.ReportFieldIndex = 0 #Установка курсора на поле с соответствующим номером
dll.ReportField = str(row[0]) #Данные должны соответствовать типу, то есть проводите преобразования типа в строку
dll.ReportFieldIndex = 1
dll.ReportField = str(row[1])
dll.ReportFieldIndex = 2
dll.ReportField = str(row[4])
dll.ReportFieldIndex = 3
dll.ReportField = str(row[3])
dll.ReportFieldIndex = 4
dll.ReportField = str(row[2])
dll.SetRecord() #Добавляем запись в таблицу

dll.EndAdd()# Загрузка данных в терминал
# После завершения операции производим вывод сообщения.
finish = QMessageBox()
finish.setWindowTitle(u'Загрузка завершена')
finish.setText(u'Загрузка завершена!')
finish.setIcon(finish.Information)
finish.exec_()
except pythoncom.com_error, (hr, msg, exc, arg):
msgBox = QMessageBox()
msgBox.setWindowTitle(msg.decode('cp1251'))
msgBox.setText(exc[2])
msgBox.setIcon(msgBox.Critical)
msgBox.exec_()

dlg.destroy()
Vader
Cover Story
Извиняюсь, а что такое трейс?
Stack Trace
Cover Story
Возможно вы имели ввиду это?
Traceback (most recent call last):
File "C:\pythonprog\pyside\22022011\new_gui_atol.py", line 140, in loadterm
for row in invlist:
UnboundLocalError: local variable 'invlist' referenced before assignment
Vader
Медитируем здесь :)
Если в первом try/except случился exception, то else не выполняется, соответственно и invlist не инициализируется, а значит во втором try/except писать for row in invlist нельзя.
            try:
reader = csv.reader(open(config.get('path', 'inpath'), "rb"), delimiter="\t")
except:
msgBox = QMessageBox()
msgBox.setWindowTitle(u'Внимание')
msgBox.setText(u'Файл отсутствует! <br> Сравните наличие файла и указанного пути в invdrv.ini')
msgBox.setIcon(msgBox.Critical)
msgBox.exec_()
else:
invlist = []
#Записываем данные в буфер драйвера
for row in reader:
invlist.append(row)


dll.FormNumber = 0 # Активируем первую таблицу для ввода инвентаризационных данных

try:
dll.BeginAdd()#Подготавливаемся к записи данных в ТСД
for row in invlist:
dll.ReportFieldIndex = 0 #Установка курсора на поле с соответствующим номером
dll.ReportField = str(row[0]) #Данные должны соответствовать типу, то есть проводите преобразования типа в строку
dll.ReportFieldIndex = 1
dll.ReportField = str(row[1])
dll.ReportFieldIndex = 2
dll.ReportField = str(row[4])
dll.ReportFieldIndex = 3
dll.ReportField = str(row[3])
dll.ReportFieldIndex = 4
dll.ReportField = str(row[2])
dll.SetRecord() #Добавляем запись в таблицу
Cover Story
Спасибо, чет я не заметил этого сразу :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB