2 Оператор Try / Except не работает в обычном порядке, но работает, когда коды переворачиваются

Добрый день, ребята, я надеюсь получить небольшой совет по этому вопросу. Я не могу заставить этот оператор 2 TRY/EXCEPT работать в том порядке, в котором я их хочу. Тем не менее, они отлично работают, если я сначала поставлю STEP2, а затем STEP1.

Этот текущий код распечатывается только.

Transferred: x rows.

Если перевернуто, они печатают оба.

Unfetched: x rows.
Transferred: x rows.

Я старался:

  • Назначение отдельных cur.close() и db.commit() согласно примерам здесь также не сработало. (Дополнительный вопрос: должен ли я, тем не менее, закрывать / фиксировать их по отдельности? Это общая хорошая практика или основанная на контексте?)

  • Используя метод cur.rowcount для шага 2, я подумал, что, возможно, проблема была в стороне SQL, но проблема все еще сохраняется.

  • Сделал поиск по SO и не смог найти ни одного подобного случая.

Запуск на Python 2.7. Код:

import MySQLdb
import os

#Initiate connection to database.
db = MySQLdb.connect(host="localhost",user="AAA",passwd="LETMEINYO",db="sandbox")
cur = db.cursor()

#Declare variables.
viewvalue = "1"

mainreplace =   (
                    "INSERT INTO datalog "
                    "SELECT * FROM cachelog WHERE viewcount = %s; "
                    "DELETE FROM cachelog WHERE viewcount = %s; "
                    % (viewvalue, viewvalue)
                )

balance =   (
                "SELECT COUNT(*) FROM cachelog "
                "WHERE viewcount > 1"
            )

#STEP 1: Copy and delete old data then print results.
try:
    cur.execute(mainreplace)
    transferred = cur.rowcount
    print "Transferred: %s rows." %(transferred)
except:
    pass

#STEP 2: Check for unfetched data and print results.
try:
    cur.execute(balance)
    unfetched = cur.fetchone()
    print "Unfetched: %s rows." % (unfetched)
except:
    pass

#Confirm and close connection.
cur.close()
db.commit()
db.close()

Прошу прощения за любой мой непифонический образ жизни, так как я все еще начинающий. Любой совет высоко ценится, спасибо!

1 ответ

Решение

У вас есть два вопиющих непифоновых фрагмента кода: использование голого except: не говоря, какое исключение вы хотите поймать, и используя pass в этом, кроме блока, поэтому исключение полностью игнорируется!

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

Возможно, проблема в том, что ваш запрос "mainreplace" удаляет все из таблицы "cachelog", поэтому запрос "balance" после него не имеет строк, поэтому fetchone() терпит неудачу, выдает исключение и строку после него никогда не выполняется. Или, может быть, что-то совершенно другое, трудно сказать отсюда.

Если у вас не было этой попытки / кроме как там, у вас было бы хорошее сообщение об ошибке, и вам не пришлось бы задавать этот вопрос.

Другие вопросы по тегам